我无法弄清楚如何使“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”时不必取消引用它。
答案 0 :(得分:3)
简短回答:你不能。简单的原因是GameState::a
和通过引用传递给GameState::init
的对象是不同的对象,它们永远不会是相同的。
现在,让我们谈谈如何在一个惯用的C ++"中解决这个问题。方式:
首先,考虑GameState::init()
的含义。它是对类GameState
的实例的调用,它只写入static
类属性。为什么不写入实例的属性?这有点闻起来好像GameState::a
实际上是一个全局变量,它继承了它的所有不良。
作为一种不同的方法,将依赖关系(如参数init()
)传递给构造函数(a.k.a。" Dependency Injection")。然后,您可以使用注入的依赖项初始化对该参数的引用:
class GameState {
public:
GameState(A& a): m_a(a) {}
private:
A& m_a;
};
请注意,您必须确保A
实例超过GameState
实例。在某些情况下,您必须动态分配内容以及不再需要它们的地方,通过智能指针(std::unique_ptr
)传递所有权是可取的,然后您可以用这样的方式替换引用智能指针。