我有以下类,其中包含unique_ptrs的向量:
class StatManager
{
private:
std::vector<std::unique_ptr<IStat>> stats;
public:
void setStat(const Stat<bool>& stat) {
stats.emplace_back(stat.clone());
}
void setStat(const Stat<float>& stat) {
stats.emplace_back(stat.clone());
}
void setStat(const Stat<int>& stat) {
stats.emplace_back(stat.clone());
}
bool getStatValue(std::string name, float &value) {
for (unsigned int x = 0; x < stats.size(); x++)
{
if (stats.at(x)->getName() == name) {
value = stats.at(x)->getAsFloat();
return true;
}
}
return false;
}
bool getStatValue(std::string name, int &value) {
for (unsigned int x = 0; x < stats.size(); x++)
{
if (stats.at(x)->getName() == name) {
value = stats.at(x)->getAsInt();
return true;
}
}
return false;
}
bool getStatValue(std::string name, bool &value) {
for (unsigned int x = 0; x < stats.size(); x++)
{
if (stats.at(x)->getName() == name) {
value = stats.at(x)->getAsBool();
return true;
}
}
return false;
}
};
实现它的类:
class BaseItem
{
private:
int id;
std::string name;
public:
BaseItem(int itemId, std::string itemName) : id(itemId), name(itemName) {}
virtual int getID() = 0;
virtual std::string getName() = 0;
};
class Item : public BaseItem
{
private:
StatManager statManager; //ERROR HERE trying to implement StatManager
public:
Item(int id, std::string name);
virtual int getID();
virtual std::string getName();
};
在尝试创建StatManager的属性时,我在visual studio 2013上收到以下错误:
Error 5 error C2280: 'std::unique_ptr<IStat,std::default_delete<_Ty>>::
unique_ptr(const std::unique_ptr<_Ty,std::default_delete<_Ty>> &)'
: \xmemory0 593 1 GameTheory++
所以在我的主类中,我只是尝试创建一个StatManager的本地实例,它没有任何问题,例如:
float f = 0;
StatManager manager; //Works flawless
manager.setStat(ItemStat("Durabilit", 100, ""));
manager.getStatValue("Durabilit", f);
所以只有在尝试将StatManager作为任何类的属性时才会出现问题......我有什么遗漏,可能是某些移动问题与独特的ptrs有关吗?我真的不知道,提前谢谢。
编辑:
只有我使用Item类的地方在main方法中,并尝试创建它的本地实例:
Item item = Item(0, "Test");
答案 0 :(得分:0)
它没有让StatManager成为一个失败的类的属性,它试图复制它。由于它包含unique_ptrs的向量,因此整个类是不可复制的。大概是你试图将它复制到你尚未发布的一些代码中。
要更好地诊断此问题的根源,请将其添加到Item类中:
Item(const Item&) = delete;
这样你在尝试复制时就会立即收到错误,而不是关于埋在Item中的unique_ptr的错误。
编辑:好的,所以您刚刚发布的代码就是问题所在:
Item item = Item(0, "Test");
这意味着&#34;创建一个项目并将其复制到item
。相反,这样做:
Item item(0, "Test");
这只会创建一个Item,并且应该有效。