gpt4 book ai didi

c++ unique_ptr inside vector 继承

转载 作者:搜寻专家 更新时间:2023-10-31 02:23:54 25 4
gpt4 key购买 nike

我正在尝试使用不同的智能指针并遇到了问题。

我有一个 Environment 抽象类和一个继承 Environment 的基础类:

class Ground : public Environment
{
protected:
std::string type;
int damage;

public:
Ground() : Environment()
{
this->type = "ground";
}

virtual void SetDamage(int _damage)
{
this->damage = _damage*5;
}

virtual std::string& GetType()
{
return this->type;
}

virtual int GetDamage()
{
return this->damage-10;
}

virtual ~Ground(){}
};

我还有一个 Dirt 类继承了 Ground 类:

class Dirt : public Ground
{
public:
Dirt() : Ground()
{
this->type = "dirt";
}

void SetDamage(int _damage)
{
this->damage = _damage*6;
}

int GetDamage()
{
return this->damage-20;
}

~Dirt()
{

}


private:

};

现在如果我想像这样在 std::vector 中使用它:

std::vector<std::unique_ptr<Ground>> listGround;

std::unique_ptr<Ground> ground(new Ground());
listGround.push_back(ground);

std::unique_ptr<Dirt> dirt(new Dirt());
listGround.push_back(dirt); // FAIL

for (auto i = listGround.begin(); i != listGround.end(); i++)
{
(*i)->SetDamage(80);
std::cout << (*i)->GetType() << " " << (*i)->GetDamage() << std::endl;
}

listGround.empty();

我收到一个编译错误,指出在上面代码中标记为 FAIL 的行上没有可用的用户定义转换运算符可以执行此转换等。

如果我使用 std::shared_ptr 一切都按预期工作。原始指针也是如此。

为什么会出现此错误?

error C2664: 'void std::vector<_Ty>::push_back(std::unique_ptr &&)' : cannot convert parameter 1 from 'std::unique_ptr<_Ty>' to 'std::unique_ptr<_Ty> &&' 1> with 1> [ 1>
_Ty=std::unique_ptr 1> ] 1> and 1> [ 1> _Ty=Dirt 1> ] 1> and 1> [ 1> _Ty=Ground 1> ] 1> Reason: cannot convert from 'std::unique_ptr<_Ty>' to 'std::unique_ptr<_Ty>' 1>
with 1> [ 1> _Ty=Dirt 1> ] 1>
and 1> [ 1> _Ty=Ground 1> ] 1>
No user-defined-conversion operator available that can perform this conversion, or the operator cannot be called

最佳答案

就地创建事物:

listGround.emplace_back(new Dirt());

它不是shared_ptr,但您尝试在dirtlistGround.back() 之间共享所有权

关于c++ unique_ptr inside vector 继承,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28754030/

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