我正在开发一个简单的游戏引擎,目前我有一个只包含整个游戏的类,在这个类中我声明了其他类(例如 Window、ErrorManager 等)。现在的问题是我想从另一个实例访问一个实例,因此例如我想从仍在游戏类中声明的 Window 实例访问游戏类中声明的 ErrorManager 实例。
我的第一个想法是,当游戏创建时,你必须传递一个指向其实例的指针,然后该实例指针将被传递给所有需要处理游戏类内实例的类,事情是这样的我不能这样做,因为我必须在 Window 类中包含 Game 类,但这会创建一个包含循环,并且编译器只会向我吐出一个错误。
有什么方法可以实现我认为的解决方案,或者有更好的整体方法来解决这个问题吗?
是的。您应该使用前向声明。
初始化对象时,将它们传递给其他对象的指针。如果每个类有一个 h 文件和一个 cpp 文件(通常是这样),请在 h 文件中声明初始化方法,并在 cpp 文件中定义它。要声明一个方法,您只需要一个类的前向声明。要定义它,您需要包含必要的 h 文件,但这不是问题。
使用前向声明来打破循环。
托管.h
#ifndef MANAGED_H
#define MANAGED_H
class manager; // forward declaration
class managed
{
manager * mgr;
managed(manager * mgr) : mgr(mgr)
{
}
};
#endif
经理.h
#ifndef MANAGER_H
#define MANAGER_H
#include "Managed.h"
class manager
{
managed mgd;
manager(): mgd(this) // note: Slightly dodgy managed::managed must NOT do
// anything other than store this because this hasn't
// been fully constructed yet
{
}
};
#endif
托管.cpp
#include "managed.h"
#include "manager.h"
// can safely include and use public portions of manager here