DenIS318
DenIS318

Reputation: 5

Forward declaration of class variable

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

Answers (2)

Peter
Peter

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

nvoigt
nvoigt

Reputation: 77294

No

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

Related Questions