我不知道如何使“a”成为与“b”相同的对象。
Gamestate.h:
class GameState {
public:
void init(A& b);
protected:
static A a;
}
Gamestate.cpp:
A GameState::a;
void GameState::init(A& b)
{
???
}
我可以使用这样的指针:
Gamestate.h:
class GameState {
public:
void init(A* b);
protected:
static A* a;
}
Gamestate.cpp:
A* GameState::a;
void GameState::init(A* b)
{
a = b;
}
但是我更希望a是相同的对象,而不是指向该对象的指针,这样我想访问“a”时就不必取消引用它。
最佳答案
简短的回答:不能。原因很简单,因为GameState::a
和通过引用传递给GameState::init
的对象是不同的对象,它们永远不会相同。
现在,让我们讨论以“惯用的C++”方式解决此问题的方法:
首先,考虑一下GameState::init()
的含义。这是对GameState
类的实例的调用,该实例仅写入static
类属性。它为什么不写入实例的属性?这听起来有点像GameState::a
实际上是一个全局变量,它继承了所有缺点。
另一种方法是,将依赖项(例如init()
的参数)传递到构造函数中(也称为“依赖项注入(inject)”)。然后,您可以使用注入(inject)的依赖项初始化对该参数的引用:
class GameState {
public:
GameState(A& a): m_a(a) {}
private:
A& m_a;
};
请注意,您必须确保
A
实例的寿命超过GameState
实例的寿命。在某些情况下,当您必须动态分配事物并且不再需要外部事物时,最好通过智能指针(std::unique_ptr
)传递所有权,然后可以用这种智能指针替换引用。关于c++ - 通过引用传递对象并将其存储为成员变量,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/49097505/