Reputation: 5
Can i forward declare class variable in other class to avoid circular dependency and if yes, how? Example:
//another file
class Engine;
extern vector<Block*> Engine::MapBlocks;
//Engine.h
class Engine
{
public:
vector<Block*> MapBlocks;
};
Its possible?
Upvotes: 0
Views: 1503
Reputation: 36597
No, what you're trying to do is not possible. It is not possible to declare non-static class members outside the class definition. If such a thing was allowed, it would allow any code to arbitrarily modify any class (e.g. by declaring a member that is not actually part of the class). Logically, that breaks the intent of using classes (e.g. encapsulation) totally.
However, it is possible to pass and store pointers to a class type, without the definition being visible. In this case
#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
};
This will work because the compiler does not need to have visibility of the definition of Block
to store pointers in a container.
Naturally, any code which attempts to instantiate a Block
(e.g. some_engine.MapBlocks.push_back(new Block)
) or call its member functions (e.g. some_engine.MapBlocks[some_valid_index]->some_member_function()
) relies on visibility of a definition of class Block
, not just a forward declaration.
Upvotes: 0
Reputation: 77294
Your class declaration has to be complete, you cannot split it or partially declare it.
If you asked about the real problem you encountered, we might be able to help you anyway. Most likely there is a solution, just not to this abstract question.
Upvotes: 3