通过引用传递对象并将其存储为成员变量
Passing an object by reference and storing it as a member variable
我不知道如何使 "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
的对象是不同的对象,它们永远不会相同。
现在,让我们谈谈以 "idiomatic C++" 方式解决此问题的方法:
首先想一想GameState::init()
是什么意思。它是对 class GameState
实例的调用,它只写入 static
class 属性。为什么它不写入实例的 属性?这闻起来有点像 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
)传递所有权是可取的,然后你可以用这样的智能指针替换引用.
我不知道如何使 "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
的对象是不同的对象,它们永远不会相同。
现在,让我们谈谈以 "idiomatic C++" 方式解决此问题的方法:
首先想一想GameState::init()
是什么意思。它是对 class GameState
实例的调用,它只写入 static
class 属性。为什么它不写入实例的 属性?这闻起来有点像 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
)传递所有权是可取的,然后你可以用这样的智能指针替换引用.