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
,不仅仅是前向声明。
我可以在其他 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
,不仅仅是前向声明。