2012-04-05 18 views
1

Ich habe mehrere Dateien, die einen Kompilierungsfehler verursacht, kann Folgendes getan werden?C++ - Pass durch Referenz - kann dies getan werden?

header1.h

class Class1{ 
public: 
void function1(Class1 &); 
}; 

header2.h

class Class2{ 
public: 
void function2(Class2 &, Class1 &); 
}; 

cpp2.cpp

#include "header2.h" 
void Class2::function2(Class2 & my2Class, Class1 & my1Class){}; 

main.cpp

#include "header1.h" 
#include "header2.h" 

// functions 

Der Fehler besagt, dass header2.h nichts von Class1 als Typ kennt. Wie kann ich ein Objekt vom Typ Class1 in dieser Header-Datei deklarieren, ohne ein Include zu verwenden oder ohne beide Klassen in dieselbe Datei zu setzen (sie sind völlig getrennt und sollten nur innerhalb von main genannte interne Funktionen erfüllen)?

Danke!

Antwort

7

können Sie Vorwärtsdeklarationen verwenden:

class Class1; //forward declare Class1 
class Class2{ 
public: 
void function2(Class2 &, Class1 &); 
}; 

einen Parameter eines Typs an eine Funktion nicht die Art erfordern vollständig definiert werden.

+0

Diese Nähte am besten in meinem speziellen Anwendung zu arbeiten. Ich musste header1.h in meine cpp2.cpp Datei auch einschließen. Danke für die Antworten! –

+0

Bitte akzeptieren Sie meine Entschuldigung, das obige war ein Tippfehler. Vielen Dank! –

+0

@ChrisJones :))) Sie bekommen ein bisschen zu formell. Ich dachte nur, dass du einen Fehler gemacht hast (kein Tippfehler) und wollte dich warnen, bevor du dich von SO ausgeloggt hast und diesen Code in die Produktion geschickt hast. : P –

0

Jede Kopfzeile muss jede Kopfzeile enthalten, für die Informationen benötigt werden, jedoch mit einer Vorverarbeitungsdefinition, um Zirkelverweise oder wiederholte Deklarationen zu vermeiden. z.B. header2 sollte

#ifndef FUNCS_H 

#define FUNCS_H 

#include "header1.h" 

    class Class2{ 
    public: 
    void function2(Class2 &, Class1 &); 
    }; 
#endif 

Dies ist sein wie ich alle meine Header in C++ tun

+0

Es stimmt zwar, dass Sie Preprozessor Wächter hinzufügen sollten. Dies wird nicht helfen, zirkuläre Referenzen zu vermeiden. –

+0

Sie sollten auch Forward-Deklarationen anstelle von Includes bevorzugen. –

+0

Warum sind Vorwärtsdeklationen besser? Ich hätte gedacht, dass das einfache Einschließen anderer Header den gleichen End-Effekt hat und Ihnen das Problem erspart, jedes Mal explizit etwas zu deklarieren, wenn Sie merken, dass Sie es brauchen. – Oofpez

Verwandte Themen