在我的程序中,我有一堆自定义类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(int x, int y)
{
this->x = x;
this->y = y;
actor.reset(nullptr);
}
但是,我知道这没有正确地将存储的指针设置为nullptr,因为当我尝试在Position :: getActor()中调用actor.get()时,我收到如下错误:
____中0x01096486处的第一次机会异常.exe:0xC0000005:访问冲突读取位置0x00000008。
有没有办法将成员unique_ptr初始化为nullptr?我知道我可以通过向Actor类添加一个变量来定义这个,该变量定义了Actor是否处于活动状态,将unique_ptr设置为新的非活动Actor,并忽略所有不活动的Actors,但我宁愿避免这种情况。
谢谢!
编辑:我已经添加了我调用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;
}
}
答案 0 :(得分:5)
您不需要将std :: unique指针初始化为null。只需将它作为构造函数中的默认空值,并将其重置为指向非空指针。
答案 1 :(得分:5)
您的错误在这里:
void setActor(Actor *actor) { actor = std::move(actor); };
您要将std::move
的结果分配给参数 actor
。您可能需要使用参数actor
reset
成员变量{{3}}:
actor
作为旁注,您只需将构造函数更改为:
void setActor(Actor *actor) { this->actor.reset(actor); };
这将使用参数初始化成员Position::Position(int x, int y)
: x(x), y(y)
{
}
和x
,并将default-initialize y
初始化为null。