gpt4 book ai didi

c++ - 重载赋值运算符 - 多态容器

转载 作者:行者123 更新时间:2023-11-30 03:01:35 26 4
gpt4 key购买 nike

我有一个基类、2 个派生类和一个实体管理器类,它有一个指向派生对象的基指针容器。我在基类中有一个虚拟克隆方法来处理派生类中的复制构造函数,但我无法解决重载赋值运算符和防止切片的问题,有人可以帮忙解决这个问题,也许可以回顾一下我是如何处理的实体管理器复制构造函数?我觉得还可以

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;
}

最佳答案

添加一个交换容器的 swap 成员,然后将赋值实现为 copy-and-swap :

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

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

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

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

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

关于c++ - 重载赋值运算符 - 多态容器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10960854/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com