Wenn die Compiler kompiliert die Klasse User
und gelangt in die MyMessageBox
Zeile, MyMessageBox
ist noch nicht definiert. Der Compiler hat keine Idee MyMessageBox
existiert, so kann die Bedeutung Ihres Klassenmitglieds nicht verstehen.
Sie müssen sicherstellen, MyMessageBox
ist definiert vor Sie verwenden es als Mitglied. Dies wird durch Umkehrung der Definitionsreihenfolge gelöst. Sie haben jedoch eine zyklische Abhängigkeit: Wenn Sie MyMessageBox
über User
verschieben, wird in der Definition von MyMessageBox
der Name User
nicht definiert werden!
Was Sie tun können, ist forward declareUser
; das heißt, deklarieren Sie es, aber definieren Sie es nicht. Ein Typ, der deklariert, aber nicht definiert ist, wird während der Kompilierung als unvollständiger Typ bezeichnet. das einfacheres Beispiel vor:
struct foo; // foo is *declared* to be a struct, but that struct is not yet defined
struct bar
{
// this is okay, it's just a pointer;
// we can point to something without knowing how that something is defined
foo* fp;
// likewise, we can form a reference to it
void some_func(foo& fr);
// but this would be an error, as before, because it requires a definition
/* foo fooMember; */
};
struct foo // okay, now define foo!
{
int fooInt;
double fooDouble;
};
void bar::some_func(foo& fr)
{
// now that foo is defined, we can read that reference:
fr.fooInt = 111605;
fr.foDouble = 123.456;
}
Durch vorwärts User
deklarieren, können MyMessageBox
noch einen Zeiger oder Verweis auf sie bilden:
class User; // let the compiler know such a class will be defined
class MyMessageBox
{
public:
// this is ok, no definitions needed yet for User (or Message)
void sendMessage(Message *msg, User *recvr);
Message receiveMessage();
vector<Message>* dataMessageList;
};
class User
{
public:
// also ok, since it's now defined
MyMessageBox dataMsgBox;
};
Sie nicht diese in die andere Richtung tun um: wie erwähnt, Ein Klassenmitglied muss eine Definition haben. (Der Grund dafür ist, dass der Compiler muss wissen, wie viel Speicher User
in Anspruch nimmt, und wissen, dass sie die Größe ihrer Mitglieder wissen muss.) Wenn Sie sagen würden:
class MyMessageBox;
class User
{
public:
// size not available! it's an incomplete type
MyMessageBox dataMsgBox;
};
würde es nicht funktionieren , da es die Größe noch nicht kennt.
Auf einer Seite zur Kenntnis, diese Funktion:
void sendMessage(Message *msg, User *recvr);
wahrscheinlich auch nicht von denen, durch Zeiger nehmen soll. Sie können keine Nachricht ohne Nachricht senden oder eine Nachricht senden, ohne dass ein Benutzer sie senden muss. Und diese beiden Situationen sind ausdrückbar durch zu null als Argument übergeben entweder Parameter
vielmehr eine Referenz (möglicherweise const) (null ein absolut gültige Zeigerwert ist!):
void sendMessage(const Message& msg, User& recvr);
Die endlosen Zeiten gehe ich diesen Fehler, nur um zu erkennen, dass die Import-Wachen von der IDE verdoppelt werden – Mazyod
Beachten Sie, dass Sie auch diesen Fehler erhalten können, wenn Sie einen externen Verweis auf eine Deklaration in einer .h/.hpp-Datei platzieren bevor die Klasse definiert wird, auch wenn Sie die tatsächliche Deklaration nach der Aufnahme von .h/.hpp in der .cpp-Datei haben. – Owl
@Mazyod. Danke Danke. Ich konnte nicht herausfinden, was zum Teufel diesen seltsamen Fehler verursacht hat. –