class 变量的前向声明

Forward declaration of class variable

我可以在其他 class 中转发声明 class 变量以避免循环依赖吗?如果可以,怎么做? 示例:

//another file
class Engine;
extern vector<Block*> Engine::MapBlocks;

//Engine.h
class Engine
{
public:
   vector<Block*> MapBlocks;
};

可能吗?

没有

您的 class 声明必须完整,不能拆分或部分声明。

如果您问的是您遇到的实际问题,无论如何我们都可以帮助您。很可能有解决方案,只是不是这个抽象问题。

不,你想做的事是不可能的。无法在 class 定义之外声明非静态 class 成员。如果允许这样的事情,它将允许任何代码任意修改任何 class(例如,通过声明一个实际上不属于 class 的成员)。从逻辑上讲,这完全违背了使用 classes(例如封装)的意图。

但是,可以传递和存储指向 class 类型的指针,而定义不可见。在这种情况下

#include <vector>     // necessary for use of std::vector

class Block;

class Engine
{
   public:
     std::vector<Block*> MapBlocks;

      // preferably declare constructors and/or other member functions
      //    that initialise MapBlocks appropriately to needs
};

这会起作用,因为编译器不需要 Block 定义的可见性来将指针存储在容器中。

自然地,任何试图实例化 Block(例如 some_engine.MapBlocks.push_back(new Block))或调用其成员函数(例如 some_engine.MapBlocks[some_valid_index]->some_member_function())的代码都依赖于 [=24] 定义的可见性=] Block,不仅仅是前向声明。