[英]overloading assignment operator - polymorphic containers
我有一個基類,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;
}
添加swap
容器的swap
成員,然后將賦值實現為復制和交換:
void swap(EntityManager& other)
{ theEntities.swap(other.theEntities); }
EntityManager& operator=(EntityManager other)
{ swap(other); return *this; }
賦值運算符的參數將使用您已經編寫的復制構造函數進行復制,然后交換數據,因此當該參數超出范圍時,屬於*this
的數據將被銷毀,並且*this
擁有新的復制數據。
以這種方式重用復制構造函數意味着您只需要實現正確的復制構造函數(並且正確的交換,這通常很容易正確),並且您的賦值運算符非常簡單並且自動更正。
注意你的init
成員和copy ctor都不是異常安全的,如果任何push_back
操作拋出異常你泄漏內存。 你也錯過了一個析構函數,但我認為它存在於實際代碼中。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.