2009-05-11 5 views
0

Ich arbeite an einer Klassenzuweisung, die klein begann, also hatte ich alles in einer Datei. Jetzt ist es größer geworden und ich versuche, Haupt, Funktionen und Klassen separat zu kompilieren (also sind alle Klassen zusammen in einer .h und einer .cpp) Ich habe eine Klasse B, die die Eltern von vielen anderen und ist kommt zuerst in der Datei. Eines seiner Datenelemente funktioniert nicht mehr, da ich eine separate Kompilierung verwende, die Dutzende von Fehlern verursacht.C++ Frage ... Definition erkennt keine Vektoren in der Deklaration angegeben

In .h

class A; 
class B { 
public: 
    B(){} 
    A* myptr; 
    void whatever(); 
    vector<A*> myAs; //this one is the problem 
}; 

In CPP

void B::whatever() { 
    vector<A*> newvector; //no problem! 
    myptr = &something; //no problem! 
    for (vector<A*>::iterator iter = myAs.begin(); iter != myAs.end(); ++iter) { 
     //error! 
    } 
} 

bekomme ich Fehler: "Klasse B hat kein Mitglied Myas" entweder oder "Myas wurde nicht in diesem Bereich erklärt"

Ich habe < vector>, nach vorne deklarierte Klasse A, wie Sie oben sehen, und ich erinnerte mich definitiv daran, die .h an der Spitze der .cpp enthalten! Gibt es etwas über Vektoren oder Klassen und separate Kompilierung, die ich nicht verstehe? Dies ist in Xcode, BTW.

+0

Gibt es eine Fehlermeldung mit der Codezeile in der Kopfzeile, die myAs deklariert? Oder gibt es nur eine Fehlermeldung mit der Codezeile in der CPP-Datei, die myAs verwendet? – ChrisW

+0

Nebenbei würde ich dringend empfehlen, dass Sie Code in den Destruktor stellen, der die Objekte löscht, auf die A * in myAs zeigt, da dies ein Speicherleck ist, das darauf wartet, andernfalls zu passieren. –

Antwort

4

Es ist nicht nur vector. Es ist std::vector, weil es innerhalb des Namensraums std ist. Deshalb stöhnt der Compiler. Es weiß nicht, was vector<A*> bedeutet. Sagen Sie stattdessen std::vector<A*>.

Do nicht hinzufügen using namespace std; jetzt in den Header, weil dies. Es kann für die Zuweisung in Ordnung sein, es in die CPP-Datei zu speichern, um das Schreiben zu sparen, wenn Sie möchten. Aber es ist eine wirklich schlechte Idee, eine solche Zeile in einen Header einzufügen: Weil Sie nicht wissen, welche Dateien in Zukunft Ihren Header benötigen. Die Situation kann schnell außer Kontrolle geraten, da die Anzahl der Dateien einschließlich Ihrer Kopfzeile mit der Zeit wächst. Der Header sollte daher nur die Namen und Header enthalten, die er wirklich benötigt, damit er so wenig Namenskonflikte wie möglich verursacht - während die Zeile using namespace std; alle Namen von std direkt sichtbar macht.

+0

Sie haben einen meiner Lieblingshats identifiziert (Programmierer, die Deklarationen in Headerdateien verwenden). +1. –

+0

Danke! Ich kann nicht glauben, dass ich nicht darüber nachgedacht habe, weil ich bemerkt habe, dass ich die Zeichenfolge in std :: string ändern musste. Ich hatte keine Ahnung, dass der Vektor dem ähnlich war. – eom

Verwandte Themen