Klasse in Dateien aufteilen



  • Ich bekomme bei meinem Code immer dieser Warnungen ausgegeben:

    [C++ Warnung] test.h(13): W8058 Präcompilierter Header: Initialisierte Daten im Header kann nicht erzeugt werden
    [C++ Warnung] test.h(13): W8058 Präcompilierter Header: Initialisierte Daten im Header kann nicht erzeugt werden
    [Linker Warnung] Public symbol '_test' defined in both module C:\DOKUMENTE UND EINSTELLUNGEN\ABC\DESKTOP\DBG\UNIT1.OBJ and C:\DOKUMENTE UND EINSTELLUNGEN\ABC\DESKTOP\DBG\TEST.OBJ
    

    main.cpp

    #include <iostream>
    #include "test.h"
    using namespace std;
    
    int main()
    {
    
    test.Ausgabe();
    
    return 0;
    }
    

    test.cpp

    #include "test.h"
    
    void TestKlasse :: Ausgabe()
    {
            std::cout<<"test"<<std::endl;
    }
    

    test.h

    #ifndef testH
    #define testH
    
    #include <iostream>
    
    class TestKlasse
    {
    
    public:
            void Ausgabe();
    };
    
    TestKlasse test;
    
    #endif
    

    Aber wenn ich schreibe:

    test.cpp

    #include "test.h"
    
    TestKlasse test;
    void TestKlasse :: Ausgabe()
    {
            std::cout<<"test"<<std::endl;
    }
    

    test.h

    #ifndef testH
    #define testH
    
    #include <iostream>
    
    class TestKlasse
    {
    
    public:
            void Ausgabe();
    };
    
    extern TestKlasse test;
    
    #endif
    

    Dann sind diese Fehler weg ich hab aber gelesen das man den extern Befehl möglichst vermeiden sollte. Wie soll man das nun richtig machen?



  • warum willst du überhaupt schon an diesen Stellen deine Klasse instantieren? Üblicherweise macht man das doch erst zu einem späteren Zeitpunkt, z.B. hier in main(). Dann kannst du dir auch das extern sparen.

    in testklasse.h sollte nur die Struktur der Klasse beschrieben werden, in testklasse.cpp dann die implementieren Methoden.

    #include <iostream>
    #include "test.h"
    using namespace std;
    
    int main()
    {
        Testklasse test;    
        test.Ausgabe();
        return 0;
    }
    

Anmelden zum Antworten