gpt4 book ai didi

c++11 - 将成员 unique_ptr 初始化为空

转载 作者:行者123 更新时间:2023-12-02 19:52:18 24 4
gpt4 key购买 nike

在我的程序中,我有一堆自定义类 Position 的对象。 Position声明如下:

class Position {
public:
Position(int x, int y);
~Position();

Actor *getActor() { return actor.get(); };
void setActor(Actor *actor) { actor = std::move(actor); };
Actor *clearActor() { return actor.release(); };

int getX() { return x; };
int getY() { return y; };

private:
int x, y;
std::unique_ptr<Actor> actor;
};

我还有一个名为 Actor 的类。并非每个 Position 都会有一个 Actor,因此大多数时候 Position 对象的 unique_ptr“actor”应该为空(我使用 unique_ptrs 在运行时自动清理与 Position 关联的任何 Actor)。

Position 构造函数如下:

Position::Position(int x, int y)
{
this->x = x;
this->y = y;
actor.reset(nullptr);
}

但是,我知道这并没有正确地将存储的指针设置为 nullptr,因为当我尝试在 Position::getActor() 内调用 actor.get() 时,出现如下错误:

____.exe 中 0x01096486 处的首次机会异常:0xC0000005:读取位置 0x00000008 时访问冲突。

有没有办法将成员 unique_ptr 初始化为 nullptr?我知道我可以通过向 Actor 类添加一个定义 Actor 是否处于事件状态的变量、将 unique_ptr 设置为新的非事件 Actor 并忽略所有非事件 Actor 来解决此问题,但如果可能的话,我宁愿避免这种情况。

谢谢!

编辑:我添加了调用 getActor 的代码:

bool Grid::addActor(Actor *actor, int x, int y)
{
Position *destination = at(x, y);

if (!destination->getActor()) {
destination->setActor(actor);
actor->setPosition(x, y);
actor->setGrid(this);
return true;
}
else {
inactive_actors.emplace_back(actor);
return false;
}
}

最佳答案

您的错误在这里:

void setActor(Actor *actor) { actor = std::move(actor); };

您正在分配 std::move 的结果到参数 actor 。您可能想 reset 成员变量actor参数为 actor :

void setActor(Actor *actor) { this->actor.reset(actor); };
<小时/>

顺便说一句,您只需将构造函数更改为:

Position::Position(int x, int y)
: x(x), y(y)
{
}

这将初始化成员xy使用参数,并默认初始化 std::unique_ptr<Actor> actor为空。

关于c++11 - 将成员 unique_ptr 初始化为空,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28777830/

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