Template
-
hustbaer schrieb:
guck mal wie viele template parameter dein klassen-template soldat hat
und dann guck wie viele du angibst
und dann lies dir nochmal die regeln bezüglich non-const lvalue referenzen und rvalues durchSind das nicht einfach nur Gehalt und Stufe?
-
Verzweiflung schrieb:
hustbaer schrieb:
guck mal wie viele template parameter dein klassen-template soldat hat
und dann guck wie viele du angibst
und dann lies dir nochmal die regeln bezüglich non-const lvalue referenzen und rvalues durchSind das nicht einfach nur Gehalt und Stufe?
Wieviele verschiedene Templateparameter? (Das sind die Dinger zwischen template < und > class)
-
Leuder ist völlig unklar, was Du suchst.
#include <iostream> using namespace std; template <typename T,typename U>class soldat{ private: T gehalt; U stufe; public: soldat(T a, U b){ gehalt = a; stufe = b;} ~soldat(){}; void getSoldat(){cout << gehalt << " " << stufe;}; }; int main() { soldat<int,float> james(3,2.71); cout << "Hello world!" << '\n'; return 0; }#include <iostream> using namespace std; template <typename T>class soldat{ private: T gehalt; T stufe; public: soldat(T a, T b){ gehalt = a; stufe = b;} ~soldat(){}; void getSoldat(){cout << gehalt << " " << stufe;}; }; int main() { soldat<int> james(3,4); cout << "Hello world!" << '\n'; return 0; }#include <iostream> using namespace std; class soldat{ private: int gehalt; int stufe; public: soldat(int a, int b){ gehalt = a; stufe = b;} ~soldat(){}; void getSoldat(){cout << gehalt << " " << stufe;}; }; int main() { soldat james(3,4); cout << "Hello world!" << '\n'; return 0; }#include <iostream> using namespace std; template<int gehalt> class soldat{ private: int stufe; public: soldat(int b){stufe = b;} ~soldat(){}; void getSoldat(){cout << gehalt << " " << stufe;}; }; int main() { soldat<3> james(4); cout << "Hello world!" << '\n'; return 0; }#include <iostream> using namespace std; template<int gehalt,int stufe> class soldat{ private: public: soldat(){} ~soldat(){}; void getSoldat(){cout << gehalt << " " << stufe;}; }; int main() { soldat<3,4> james();//löl cout << "Hello world!" << '\n'; return 0; }#include <iostream> using namespace std; template<typename U,typename V,U gehalt,V stufe> class soldat{ private: public: soldat(){} ~soldat(){}; void getSoldat(){cout << gehalt << " " << stufe;}; }; int main() { soldat<int,long,3,4> james; cout << "Hello world!" << '\n'; return 0; }
-
hustbaer schrieb:
und dann lies dir nochmal die regeln bezüglich non-const lvalue referenzen und rvalues durch
Was hustbaer damit meint:
soldat(T &a, T &b){ gehalt = a; stufe = b;}Dass a und b Referenzen sind, ist hier überflüssig. Da sie nicht verändert werden, reicht auch einfach call by value (ohne Ampersand) - falls man aber sicherstellen möchte, dass keine Kopie angelegt wird, macht man eine Const-Referenz (oder wie auch immer Nexus das geschrieben haben will :D):
soldat(T const& a, T const& b){ gehalt = a; stufe = b;}
-
Arcoth schrieb:
Const-Referenz (oder wie auch immer Nexus das geschrieben haben will :D)
Richtig so

Wobei die Hauptsache ist, dass man nicht von "konstanter Referenz" spricht.
-
Danke für die vielen guten Post.
Hat mir schonmal sehr geholfen
Muss jetzt nur noch bisschen Praxis rein bekommen damit ich den Kram glaube ich wirklich verstehe und inhaliert habe

Aber eine kleine Frage habe ich noch auch, wenn die sicher google bar wäre
#include <iostream> using namespace std; template <class T> class soldat{ private: int gehalt; int rang; public: soldat(T &a,T &b){gehalt=a;rang=b;}; // Warum funktionieren hier keine Referenzen oO soldat(){}; void get_lesen(){cout << gehalt << " " << rang;}; }; int main() { soldat<int> james(3,4); cout << "Hello world!" << '\n'; return 0; }
-
Weil du nur LValues (grob: adressierbare Objekte) an Referenzen binden kannst.
3ist ein Literal und als solches kein Objekt mit einer assoziierten Adresse im Speicher. Worauf sollte also die Referenz zeigen?
-
Verzweiflung schrieb:
// ... template <class T> class soldat{ private: T gehalt; T rang; // ... };Wenn schon Template, dann verwende es auch bitte. Sonst kannst du dein Template auch ganz streichen.
-
Dank euch komme ich deutlich besser jetzt mit Templates klar hab aber leider wieder ne Frage. Ich versuche gerade warum auch immer eine Template Klasse in eine Template Klasse einzubauen. Ich gehe mal einfach davon aus das es möglich ist
Ka ob man sowas überhaupt braucht aber naja man lebt nur einmal 
template<class T> class mt{ public: void get_test(){cout << "Test";}; template <class A, class B> double addieren(A a, B b){ return a+b; } template<class X> class kana{ private: X affe; public: kana(X a){affe = a;}; ~kana(){}; void get_test2(){cout << "KANA";}; }; }; int main(){ int erster=1; double zweiter = 2.2; mt<void> hund; // ich bin mir schon bewusst das templates mit void prima sein müssen xD hund.get_test(); cout << " " << hund.addieren(2,3) << " " << hund.addieren(erster,zweiter); hund.kana<int> lili(3); }
-
Das geht schon, aber Subklassen musst du über ihre vollen Klassennamen ansprechen, soll heißen:
mt<void>::kana<int> lili(3);
-
Eine letzte Frage noch versprochen

Ohne was dafür groß zutun also gar nicht erstellt sich der Konstruktor von Kana schonmal. Also müsste ich die Klasse in meiner Klasse doch über hund ansprechen können in main was als Objekt für die Klasse mt erstellt wurde oder?Ausgabe:
MT Konstruktor
Test 5 3.2
KANA KONSTRUKTORSuper schonmal das sich die Kana Klasse selber schonmal erstellt wie ich die auch immer, dann ansprechen soll ohne Name xD.
#include <iostream> using namespace std; template<class T> class mt{ public: mt(){cout << endl << "MT Konstruktor " << endl;}; // HIER DER KONSTRUKTOR void get_test(){cout << "Test";}; template <class A, class B> double addieren(A a, B b){ return a+b; } template<class X> class kana{ private: X affe; public: kana(X a=3){affe = a; cout << endl << "KANA KONSTRUKTOR" << endl;}; ~kana(){}; void get_test2(){cout << "KANA";}; }; }; int main(){ int erster=1; double zweiter = 2.2; mt<void> hund; hund.get_test(); cout << " " << hund.addieren(2,3) << " " << hund.addieren(erster,zweiter); mt<void>::kana<int> lili(3); lili.get_test2(); }
-
Klassen in Klassen sind in C++ immer statisch. D.h.
hundhat keinkana-Objekt.
Du kannsthundallerdings ein solches Objekt geben, indem du inhundeinenmt<T>::kana<int>-Objekt gibst. Das würde den Template-character allerdings wieder völlig zerstören... (Da du einen Datentyp vorgeben musst)