Klassenobjekt in anderer Klasse



  • Also so mache ich es momentan:

    //stdafx.h
    
    #pragma once
    
    #include "targetver.h"
    
    // Selten verwendete Teile der Windows-Header nicht einbinden.
    #define WIN32_LEAN_AND_MEAN
    // Windows-Headerdateien:
    #include <windows.h>
    // C RunTime-Headerdateien
    #include <cstdlib>
    #include <malloc.h>
    #include <memory.h>
    #include <tchar.h>
    
    #include "class2.h"
    
    // class2.h
    
    #ifndef CLASSTWO_H__INCLUDED
    #define CLASSTWO_H__INCLUDED
    
    #include "stdafx.h"
    
    class class2 {
    public:
        int dosomething();
    private:
        int i;
    };
    
    #endif
    
    // class1.h
    
    #ifndef CLASSONE_H__INCLUDED
    #define CLASSONE_H__INCLUDED
    
    #include "stdafx.h"
    
    class class3 {
    public:
        int i;
    };
    
    class class1 {
    private:
        class2 klasse2; // wenn es funktionieren würde
        class3 klasse3; // funktioniert so
    public:
        // sonstiges
    };
    
    #endif
    

    Wenn ich jetzt aber die class3.h nicht über stdafx.h einbinde, sondern direkt in class1.h klappt es. Leider klappt es nur mit einer Probeklasse. Wenn ich es mit meinen herkömmlichen Klassen mache, spuckt der Kompiler so sinnlose Fehler wie Syntaxfehler '<' kann nicht in if-Abfrage stehen oder unerwartetes Dateiende gefunden.
    In allen meinen Headern benutze ich dieses #ifndef ... #define ...


  • Mod

    😕 Was wird jetzt wo eingebunden? Zeig mal genau die class1.h ohne irgendetwas von Hand zu ändern.

    Falls ansonsten alles richtig sein sollte habe ich noch eine wilde Spekulation: Dieses stdafx.h bedeutet doch ,dass du Visual C++ benutzt und vorkompilierte Header benutzt. Sind die vorkompilierten Header auch alle aktuell? Ich kenne mich mit VC nicht aus, aber versuch doch mal ein leeres Projekt ohne vorkompilierte Header zu machen und kopier dort deinen Code rein.



  • @DocShoe
    Was genau meinst du genau mit einer zirkulären Aggregation. Wäre nett, wen ndu das näher erläutern könntest.

    @SeppJ
    Hab den vorigen Code jetzt mal übersichtlicher gestaltet. Also du class2.h wird in stdafx.h eingebunden und die stdafx.h binde ich generell in jede Datei ein.
    Und die Header habe ich jetzt nochmal alle neu kompiliert, aber daran lag es nicht.


  • Administrator

    stdafx.hpp bindet man nur in die *.cpp und nicht in die *.hpp Files ein.

    Grüssli


  • Mod

    Hat VC nicht eine Sonderbehandlung von stdafx.h? Ich habe nur den Wikipediaartikel dazu gelesen, aber da stand, dass alles vor #include "stdafx.h" ingoriert wird. Nun bindet stdafx.h aber class2.h ein, welches wiederum stdafx.h einbindet. Wird dadurch eventuell alles was davor in stdafx.h steht ignoriert?

    Denn an sich funktioniert dies so, wenn stdafx.h ein ganz normaler Header ist. Zur Sicherheit habe ich es auch eben noch per Copy&Paste mit dem GCC ausprobiert, damit ich auch keine vergessene Klammer oder Semikolon übersehe. Hat auch funktioniert, außer dass er natürlich windows.h und tchar.h nicht kannte.



  • Dravere schrieb:

    stdafx.hpp bindet man nur in die *.cpp und nicht in die *.hpp Files ein.

    Gibt es dafür einen Grund? Ich hab bisher immer die stdafx.h in jede Datei eingebunden und hatte bis jetzt noch keine Probleme.

    SeppJ schrieb:

    Hat VC nicht eine Sonderbehandlung von stdafx.h? Ich habe nur den Wikipediaartikel dazu gelesen, aber da stand, dass alles vor #include "stdafx.h" ingoriert wird. Nun bindet stdafx.h aber class2.h ein, welches wiederum stdafx.h einbindet. Wird dadurch eventuell alles was davor in stdafx.h steht ignoriert?

    Was war das denn für ein Artikel? Hab den gerade nicht gefunden. Und wenn vor #include "stdafx.h" alles ignoriert wird, dürfte mein Programm doch gar nicht richtig laufen.



  • Pikkolini schrieb:

    Gibt es dafür einen Grund? Ich hab bisher immer die stdafx.h in jede Datei eingebunden und hatte bis jetzt noch keine Probleme.

    Wenn du "stdafx.h" am Anfang jeder .cpp-Datei inkludierst, hast du damit bereits alle Übersetzungseinheiten abgedeckt. Die Einbindung in den Headerdateien ist somit unnötig.

    Pikkolini schrieb:

    Und wenn vor #include "stdafx.h" alles ignoriert wird, dürfte mein Programm doch gar nicht richtig laufen.

    Soweit ich weiss, sollte #include "stdafx.h" bei der Verwendung vorkompilierter Header in MSVC++ die erste Anweisung in jeder .cpp-Datei sein.



  • Hmm ich habe jetzt erstmal alle includes in den Headerfiles auskommentiet und mein Programm funktioniert immernoch 🙂
    Dann wollte ich ein Klassenobjekt in der Klasse erstellen, und es kam wieder der gleiche Fehler. Wenn ich dann aber einzeln jede Headerfile die ich brauche inkludiere und die stdafx.h weglasse funktioniert es wieder. Wieso muss ich in diesem Fall überhaupt was inkludieren, und wieso kann es nicht die stdafx.h sein?





  • Pikkolini schrieb:

    @DocShoe
    Was genau meinst du genau mit einer zirkulären Aggregation. Wäre nett, wen ndu das näher erläutern könntest.

    // class1.h
    #include "class2.h"
    
    class Class1
    {
       Class2 dummy;
       ...
    };
    
    // class2.h
    #include "class1.h"
    
    class Class2
    {
       Class1 dummy;
       ...
    };
    


  • In class1.h ist die Klasse class2 unbekannt. Du must class2.h in class1.h inkludieren.

    Edit: Was sollen denn Klassenobjekte sein? Es gibt Klassen, es gibt Objekte, aber Klassenobjekte gibt es nicht.


Anmelden zum Antworten