【问题标题】:overloading assignment operator - polymorphic containers重载赋值运算符 - 多态容器
【发布时间】:2023-04-07 04:32:01
【问题描述】:

我有一个基类、2 个派生类和一个 entitymanager 类,该类有一个指向派生对象的基指针容器。我在基类中有一个虚拟克隆方法来处理派生类中的复制构造函数,但是我在重载赋值运算符和防止切片方面遇到了麻烦,有人可以帮忙,也许可以回顾一下我是如何处理的entitymanager 复制构造函数?我觉得还可以

class System
{
public:
    virtual System* clone()=0;
};

class projectile :public System
{
public:
    projectile* clone()
    {
        return new projectile(*this);
    }
};

class player : public System
{
public:
     player* clone()
    {
        return new player(*this);
    }
};

class EntityManager
{
private:
    vector<System*> theEntities;
public:
    EntityManager(){}
    EntityManager(EntityManager& other)
    {
        for (size_t i=0;i<other.theEntities.size();i++)
            theEntities.push_back(other.theEntities[i]->clone());
    }
    void init()
    {
        projectile* aProjectile = new projectile;
        player* aPlayer = new player;
        theEntities.push_back(aProjectile);
        theEntities.push_back(aPlayer);
    }
};

int main (int argc, char * const argv[]) 
{
    EntityManager originalManager;
    originalManager.init();
    EntityManager copyManager(originalManager);

    return 0;
}

【问题讨论】:

  • 您是否遇到过特定的错误/问题?如果这只是一个代码审查问题,更适合codereview.stackexchange.com
  • 我的具体问题是我需要知道如何在给定多态容器的情况下重载赋值运算符。
  • @coolmrcroc 您能否提供一个您认为可能发生切片的具体示例?
  • 到目前为止我什么都没做。我只需要知道如何重载赋值运算符。

标签: c++ inheritance operator-overloading assignment-operator


【解决方案1】:

添加一个交换容器的swap 成员,然后将分配实现为复制和交换:

void swap(EntityManager& other)
{ theEntities.swap(other.theEntities); }

EntityManager& operator=(EntityManager other)
{ swap(other); return *this; }

赋值运算符的参数将使用您已经编写的复制构造函数复制,然后交换数据,因此属于*this的数据将在该参数超出范围时被销毁,并且@ 987654324@拥有新复制的数据。

以这种方式重用复制构造函数意味着您只需要实现一个正确的复制构造函数(以及正确的交换,这通常很容易正确),并且您的赋值运算符非常简单并且自动正确。

注意您的 init 成员和复制 ctor 不是异常安全的,如果任何 push_back 操作引发异常,您就会泄漏内存。您还缺少一个析构函数,但我认为它存在于真实代码中。

【讨论】:

  • +1,只要有可能,您应该始终实现swap(还提供免费功能swap)。这将有助于简化代码并提供异常保证。
猜你喜欢
  • 2013-09-18
  • 1970-01-01
  • 2013-03-30
  • 2013-02-14
  • 2016-08-30
  • 1970-01-01
  • 1970-01-01
  • 2018-05-13
  • 2011-03-06
相关资源
最近更新 更多