error C2027: Verwendung des undefinierten Typs



  • Hallo,

    habe folgendes Problem:

    habe ein Programm geschrieben, das logische Gatter erstellen und anschliessend verschalten kann. Das Programm besteht aus folenden hier relevanten Dateien:

    "conn.h" enthält Klasse Konnektor und abgeleitete Klassen Ausgang und Eingang.
    "gate.h" enthält Klasse Gatter und abgeleitete Klassen UndGatter usw.
    conn.cpp und gate.cpp enthalten die dazugehörigen Funktionen. Da die meisten Kunktionen aber aus nur einer nweisung bestehen habe ich sie direkt in der Klasse als inline deklariert.

    In der Klasse Ausgang habe ich nun eine Zugriffsfunktion auf einen STL-Vector die ich über eine Funktion in der Klasse Gatter aufrufen möchte...

    class Ausgang : public Konnektor
    {
    //...
    public:
    /...
    bool istVerbunden() { return (verbList.size()); }
    };

    class Gatter
    {
    protected:
    /..
    Ausgang *aus;
    public:
    /..
    bool ausgangVerbunden() { return aus->istVerbunden(); }
    };

    Das Problem ist jetzt, das er mir sagt Typ Ausgang sei nicht definiert. Schreibe ich die Funktion ausgangVerbunden() jetzt aber in die gate.cpp geht es. Egal ob inline oder normal. Jetzt frage ich mich nur wieso. Eigentlich sollte es doch keinen Unterschied machen?

    Die headerdateien habe ich jeweis gegenseitig includiert mit vorabdeklarationen der Klassen, daran sollte es also auch nicht liegen?

    Bin um jeden Rat dankbar!



  • Die headerdateien habe ich jeweis gegenseitig includiert mit vorabdeklarationen der Klassen, daran sollte es also auch nicht liegen?

    Doch. Die Vorwärtsdeklarationen reichen nur, wenn du lediglich einen Zeiger/Referenz hast. Sobald du die Klasse selbst verwenden willst, musst du den Header inkludiere.

    Also in gate.h sollte conn.h inkludieren. conn.h sollte nichts vom gate.h wissen müssen und somit solltest du hier nicht einmal eine Vorwärtsdeklaration brauchen. (rein vom Design her). Falls du doch irgendwie das gegenseitig brauchst, musst du alle Funktionenin die .cpp auslagern und dort die Header inkludieren, während du in den Headern (falls nötig) Vorwärtsdeklarationen hast.

    btw.
    Benutz das nächste mal bitte die cpp-Tags, damit man das besser lesen kann.



  • habe mich vielleicht etwas ungeschickt ausgedrückt. Die header sind gegenseitig includiert. Nur vor der includierung sind vorwärtsdeklarationen, sodass die Klassen beim gegenseitigen includieren bekannt sind. Verstehe schon, dass es so nur in einer Richtung, also in Abhängigkeit der Reihenfolge der Includierung in der main funktioniert. Eben weil man mit Vorwärtsdeklaration nur Zeiger oder Ref. erzeugen kann. Demnach müsste es also so auf jeden Fall funktionieren, da die header ja includiert ist. Tut es aber nicht 😞 Ist ja auch eigentlich kein Problen die Funktion in die cpp zu schreiben. Fuchst mich aber warum es nicht auch so geht.

    #ifndef CONN_H
    #define CONN_H
    
    #include <vector>
    
    using namespace std;
    
    class Konnektor
    {
       //..
    };
    
    class Ausgang : public Konnektor
    {
    	vector<Eingang*> verbList;
    public:
    	//..
    	bool istVerbunden() { return verbList.size(); }
    };
    
    #endif
    
    #ifndef GATE_H
    #define GATE_H
    
    #include "conn.h"
    
    class Gatter
    {
    protected:
    	//..
    	Ausgang *aus;
    public:
    	//..
    	bool ausgangVerbunden() { return aus->istVerbunden(); } //error C2027: Verwendung des undefinierten Typs "Ausgang"
    };
    
    #endif
    


  • Ich sehe in dem Beispiel jetzt keine Cross Includes..
    Hier wird ja lediglich ein File included und das sollte so gehen..

    Im übrigen solltest du die Vorwärtsdeklaration dort hinmachen, wo du sie brauchst..

    a.h

    class B; //kein include
    
    class A
    {
     B* b;
    };
    

    b.h

    class A; //auch kein include
    
    class B
    {
     A* a;
    };
    

    So würde das dann aussehen. Allerdings ist da die Frage, ob z.B B wirklich etwas mit A zu tun hat oder das besser anderst designt werden kann. Und somit fällt dann das cross Include weg.

    btw:
    Niemals using namespace in einen Header packen!



  • ja, ich habe es zum Testen mal ohne versucht. Naja muss mich wohl mal näher damit befassen damit es klarer wird. Danke!


Anmelden zum Antworten