Deklaration einer Klasse in anderer Klasse und definition dieser in cpp datei



  • ja hab ich



  • ich vermute es ist nicht standardkonform, vielleicht meckert der compiler deshalb.



  • Hallo,

    was genau ist denn nicht standardkonform?



  • das wüsste ich jetzt aber auch gerne^^
    achja, noch ne anmerkung:

    das funktioniert

    //datei.cpp
    #include "header.h"
    class test::foo{
        public:
            void bar(){
            std::cout<<"blub";
            int i;
            std::cin>>i;
            }
    };
    
    void foo(){
     test::foo b;//hier gehts
     b.bar();
    }
    

    das nicht:

    #include "header.h"
    int main(int argc, char* argv[])
    {
        test::foo a;//hier nicht
        return 0;
    }
    


  • Die Nested-Klasse muss in der Header-Datei definiert werden:

    //h
    
    struct A
    {
    	struct B;
    	//hier können nur referenzen und
    	//zeiger von B benutzt werden,
    	//da die Definition erst später erfolgt
    };
    
    struct A::B
    {
    	void foo();
    };
    
    //cpp
    
    void A::B::foo()
    {
    }
    


  • omg, das is ja echt um 2 ecken gedacht...

    aber es funktioniert 🙂



  • //sorry Müll



  • sorry für 3fachpost:
    also, meine header datei sieht jetzt so aus:

    #ifndef File
    #define File
    #include <iostream>
    class test{
        private:
            template<class U>
            class foo;
        public:
            typedef foo<int> bar;
    };
    template<class T>
    class test::foo{
        public:
            void bar();
    };
    #endif
    

    so die cpp:

    #include "File2.h"
    void test::foo<int>::bar(){
        std::cout<<"blub";
    }
    

    so funktioniert das...aber wenn ich versuche, dass ganze etwas allgemeiner zu machen, dann kommt der compiler nich mehr weiter:

    //die cpp
    #include "File2.h"
    template<class T>
    void test::foo<T>::bar(){
        std::cout<<"blub";
    }
    

    fehler: unresolved external
    so, dann hatte ich noch ne 3. möglichkeit ausprobiert:

    //der header
    [cpp]
    #ifndef File
    #define File
    #include <iostream>
    template<class T>
    class test{
        private:
            template<class U>
            class foo;
        public:
            typedef foo<T> bar;
    };
    template<class T>
    class test<T>::foo{
        public:
            void bar();
    };
    
    //die cpp
    #include "File2.h"
    template<class T>
    void test<T>::foo<T>::bar(){
        std::cout<<"blub";
    }
    

    [C++ Error] File1.cpp(3): E2316 'test<T>::foo<T>::bar()' is not a member of 'test<T>::foo<T>'

    ich seh schon, mit templates wird das ganze verdammt tückisch
    //edit das letzte problem hab ich nun gelöst bekommen:

    template<class T>template<class U> void test<T>::foo<U>::bar(){
        std::cout<<"blub";
    }
    

    nunja...fast...die unresolved external meldung hat den alten Fehler nun ersetzt 😃





  • und dabei hab ich die FAQ schon durchsucht :wand:

    najut, danke 🙂


Anmelden zum Antworten