Deklaration einer Klasse in anderer Klasse und definition dieser in cpp datei
-
also, ihr kennt ja sicher folgende konstrukte:
class foo{ public: class bar{ //alles was zu ner Klasse halt gehört }; };
auch wenn man über ihre benutzung streiten kann,manchmal sind sie nützlich(zb kann darüber iteratoren gut implementieren)
bei ner großen Klasse wird das natürlich zu einem problem mit der übersichtlichkeit.drum dachte ich mir, dass man vielleicht einfach sowas schreiben kann:
//header.h class foo{ public: class bar; };
//datei.cpp class foo::bar{//ka wie da die genaue syntax ist, hab mehrere möglichkeiten getestet //alles was zu ner Klasse gehört };
nunja, falsch gedacht,der compiler begrüßt mich mit einem "undefined structure foo::bar" oder steh ich nur auf ner leitung? oder gibts vielleicht ne bessere möglichkeit, ganze klassenimplementationen wegzukapseln(möglichst ohne vererbung)?
-
Hallo,
hast du auch den Header.h in Datei.cpp eingebunden? Normalerweise funktioniert das so.
-
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