Question:
I wrote:
class Adjective { Sentence adjective_sentence; }; class Noun { Adjective a; }; class NounPhrase { Noun n; }; class Sentence { NounPhrase np; };
Of course it doesn’t work, because I try to create an object before its class is defined. The opposite order (Sentence-NounPhrase-Noun-Adjective) also doesn’t work now because in Sentence I declare a nounphrase object.
It must be a simple problem to solve, because I tried this in Java and worked perfectly.
Answer:
Instead of creating complete objects as data members, forward declare all classes, and then use pointers or references as data members:
class Sentence; // fwd declarationclass Noun; // ditto class Adjective { Sentence * padjective_sentence; //fine }; class Noun { Adjective & radj; // reference, also fine }; class NounPhrase { Noun * pnoun; };
]
In a separate .cpp file, where the member functions of these classes are defined, you can allocate the object members dynamically and assign their address to the pointers or references:
#include "sentence.h"#include "adjective.h"#include "noun.h"#include "nounphrase.h"Adjective::Adjective { padjective_sentence new Sentence; }Adjective::~Adjective { delete padjective_sentence;}