前向声明类变量

时间:2017-10-13 11:57:42

标签: c++ inheritance forward-declaration

我可以在其他类中转发声明类变量以避免循环依赖,如果是,如何? 例如:

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

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

可能吗?

2 个答案:

答案 0 :(得分:3)

没有

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

如果您询问遇到的真正问题,我们或许可以帮助您。很可能有一个解决方案,而不是这个抽象的问题。

答案 1 :(得分:0)

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

但是,可以将指针传递并存储到类类型,而不会显示定义。在这种情况下

#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())的代码都依赖于类{{1}的定义的可见性},而不仅仅是前瞻声明。