【问题标题】:Forward declaration of class variable类变量的前向声明
【发布时间】:2017-10-13 11:57:42
【问题描述】:

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

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

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

有可能吗?

【问题讨论】:

  • 不行不行
  • C++ 没有部分类。

标签: c++ inheritance forward-declaration


【解决方案1】:

没有

你的类声明必须完整,不能拆分或部分声明。

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

【讨论】:

    【解决方案2】:

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

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

    #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]-&gt;some_member_function())的代码都依赖于Block类定义的可见性,而不仅仅是前向声明。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-08
      • 1970-01-01
      • 2021-12-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多