我无法弄清楚如何使“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()
的参数)传递给构造函数(a.k.a.“Dependency Injection”)。然后,您可以使用注入的依赖项初始化对该参数的引用:
class GameState {
public:
GameState(A& a): m_a(a) {}
private:
A& m_a;
};
请注意,您必须确保A
实例比GameState
实例更长。在某些情况下,您必须动态分配内容以及不再需要它们的地方,通过智能指针(std::unique_ptr
)传递所有权是可取的,然后您可以用这样的智能指针替换引用。