I’m writing something in C++. I have 2 classes which I want to contain one into the other as in the folowing (these are just the header files):
//Timing.h
#ifndef _Timing_h
#define _Timing_h
#include "Agent.h"
class Timing{
private:
typedef struct Message{
Agent* _agent; //i get here a compilation problem
double _id;
} Message;
typedef struct MessageArr{
} MessageArr;
public:
Timing();
~Timing();
};
#endif
//Agent.h
#ifndef _Agent_h
#define _Agent_h
#include <string>
#include "Timing.h"
using namespace std;
class Agent{
public:
Agent(string agentName);
void SetNextAgent(Agent* nextAgent);
Agent* GetNextAgent();
void SendMessage(Agent* toAgent, double id);
void RecieveMessage(double val);
~Agent();
private:
string _agentName;
double _pID;
double _mID;
Agent* _nextAgent;
};
#endif
The compilation error is in the Timing.h file inside the definition of the struct:
expected ‘;’ before ‘*’ token
What am I doing wrong?
Try not to include “Agent.h” in Timing.h but include a forward reference instead:
You can include
Agent.hin thetiming.cppfile.This way you remove the circular reference and you reduce the coupling between the classes.
Since you don’t use the class
Timingin your classAgent, you can remove this include as well (but this might be a copy mistake from your shortened example).Basically – whenever you need either the size of an object or some of it’s functionality, you must include its header file. If you don’t need it (e.g. if you use only pointers to this object or references), you should not. This reduces compile time (especially for large projects)
For the 1 instance problem – check your favorite design patterns book (e.g. the GoF). The singleton pattern might be what you need.