wie setze ich Funktion die Objekt zurückgibt richtig ein??
-
Wie setzt man eine Methode einer Klasse, welche ein anderes Klassenobjekt zurückgibt richtig ein?
class TMember { public: void ShowIt()const{cout<<"Test"<<endl;} }; class TBase { public: test CreateIt(){test t; return t;} //soll ein test-objekt zurueckgeben! }; int main(int argc, char* argv[]) { Base *b = new Base(); //Base-Objekt erzeugt, und jetzt?? return 0; }
-
Hallo,
Was ist test? Oder meinst du vielleicht eine Instanz von TMember?
Ansonstenclass TMember { public: void ShowIt()const{cout<<"Test"<<endl;} }; class TBase { public: TMember CreateIt(){TMember t; return t;} //soll ein TMember-objekt zurueckgeben! }; int main(int argc, char* argv[]) { Base *b = new Base; //Base-Objekt erzeugt, und jetzt?? TMember p = b->CreateIt(); // TMember-Instanz erzeugt (Copy-Konstruktor von TMember muss existieren (ist hier gegeben) delete b; // Löschen von b nicht vergessen return 0; }
Ciao
-
ja meine ein TMember Objekt...
ach so geht das...hab ich mir schon gedacht, find das nur ein bisschen komisch!
Also meine Frage ganz konkret:
Es geht also nicht, das ein Objekt automatisch (also ohne erst AndereKlasse Objekt = RichtigeKlasse->CreateIt() aufzurufen)erzeugt....?
-
Es geht sicher auch anders. Vielleicht erklärst du uns mal was du eigentlich erreichen willst. So ist deine Fragestellung etwas unklar.
Warum soll das TMember-Objekt überhaupt von TBase erstellt werden?
-
na ich mein allgemein, ich bin grad am lernen, und da würde mich das mal interessieren!
Also zB dachte ich (ohne mich bis dahin damit beschäftigt zu haben), das es so geht...
M = B->CreateIt(); //M jetzt Memberinstanz
wobei mir schon irgendwie logisch ist das es so nciht geht...
aber weißt du jetzt wie ich das meine?
-
aber weißt du jetzt wie ich das meine?
Nicht direkt.
Dein M muss hier vor der Verwendung erst deklariert werden. Wenn du nur die Funktion von TMember aufrufen willst, brauchst du aber keine eigene Instanz. Das geht auch soB->CreateIt().ShowIt();
-
hm...schwer zu erklären...
Eigentlich will ich wirklich nur wissen, wie ich ein Objekt, welches in einer MEthode einer anderen Klasse erzeugt wird, verwenden kann!
Hier noch eine Frage:
B->CreateIt().ShowIt();
wie muss die CreateIt() Funktion aussehen, damit das Objekt dynamisch erzeugt wird?
Also das ich das dann so machen kann...B->CreateIt()->ShowIt();
hab schon fast alles probiert, geht irgendwie alles nich...
-
Da müßte CreateIt einen Pointer auf TMember zurückgeben. Indiesem Fall brauchst du aber immer eine Instanz von TMember (z.Bsp. als Membervariable von TBase);
class TMember { public: void ShowIt()const{cout<<"Test"<<endl;} }; class TBase { private: TMember member; public: TMember* GetMember(){ return &member; } //gibt Pointer auf TMember zurück }; int main(int argc, char* argv[]) { Base *b = new Base; //Base-Objekt erzeugt b->GetMember()->ShowIt(); delete b; // Löschen von b nicht vergessen return 0; }
So etwas würde ich aber nie machen. Man könnte hier in die Versuchung geraten den zurückgegebenen Pointer einen Objekt zuzuweisen und dieses dann zu löschen oder zu überschreiben, was beides zu Zugriffsverletzungen führen würde.
-
hoi
meinst das vielleicht so ?
class TMember { ... public: void ShowIt(void) { cout << "da bin ich"; } ... } class TBase { ... public: TMember CreateIt(int vielleicht_ein_parameter) { return TMember(vielleicht_ein_parameter); } } int main(void) { TBase test; int vielleicht_mit_parameter(12); test.CreateIt(vielleicht_mit_parameter).ShowIt(); return 0; }
Meep Meep
-
@braunstein, ah die Membervariable hatte ich falsch geschrieben(rofl), darum hats bei mir nich geklappt!
@Meep...danke.....aber ist das nicht ungefähr das was Braunstein oben geschrieben hatte?Aber wie ich sehe, scheint es wirklich nur so zu gehen....das ich irgendwo IMMER noch extra ein Objekt erstellen muss....
//also so TMember p = b->CreateIt(); //statt so (in irgendeiner Art und Weiße) p = b->CreateIt();
ich danke euch trotzdem...sonst hätte ich mir wohl ewig daran den kopf zerbrochen!
-
Ich will Dich ja nicht schocken ;), aber das ganze geht auch so:
#include <iostream> using namespace std; class TMember { public: void ShowIt()const{cout<<"Test"<<endl;} }; class TBase { public: TMember *GetMember(){ return new TMember(); } //TMember-Objekt dynamisch erzeugt }; int main() { TMember *p; TBase *b = new TBase(); //TBase-Objekt dynamisch erzeugt p = b->GetMember(); p->ShowIt(); delete b; // Löschen von b nicht vergessen delete p; // Löschen von p nicht vergessen }
-
Solche Konstrukte würde ich aber versuchen zu vermeiden. Hier vergisst man leicht einmal den zurückgegebenen Pointer zu löschen.
-
damit schockst du mich nich...freut mich eher!
Wenn du mir das noch bissl erklärst....warum grad so....wäre nett!
-
nillables Vorschlag ist zwar richtig, aber total dreckig und wird nur von Anfängern so gemacht.
Im Übrigen willst du eine Factory bauen, so lautet der korrekte Begriff. Weil du da wie in einer Fabrik Objekte baust.
Aber sauberer wäre das hier (um die Kritik von Braunstein hier mit eine Lösung zu vervollständigen):
#include <memory> using namespace std; auto_ptr<TMember> createTMember() { auto_ptr<TMember> obj(new TMember()); return obj; }
Erklärung zum ganzen findet man hier
-
getMember sollte man aber eine Factory nicht gerade nennen. Da "get" eigentlich bedeutet, das man ein Attribut eines Objectes will. Also immer das gleiche und nicht jedes mal ein neues. Wenn dann sollte man es schon createTMember() nennen, dann weiß jeder das bei aufruf dieser Methode/Funktion wirklich jedesmal ein neues TMember erzeugt wird.
-
Manchmal will man eben bei jedem Aufruf ein neues Objekt und nicht immer einen Zeiger auf das gleiche bekommen. Der Name der erstellenden Methode sollte aber dann, wie Artchi richtig bemerkt, eigentlich nicht Get... sein, sondern Create... so wie Du es am Anfang hattest. Wenn man nicht dynamisch eine Instanz erstellt und diese zurückgibt (
TMember t; return t;
), wird das komplette Objekt kopiert und das lokale gelöscht, was man aber manchmal (vor allem bei größeren Objekten) vermeiden will. Das dynamische Erzeugen von Objekten, wird, wie Artchi schon andeutete, häufig gemäß des Entwurfsmusters "Abstrakte Fabrik" realisiert (allerdings selten von Anfängern).
http://de.wikipedia.org/wiki/Abstrakte_Fabrik
-
Für einen Anfänger wäre aber das hier wohl erstmal mal einfacher:
http://de.wikipedia.org/wiki/Fabrikmethode
-
nun bin ich bisschen verwirrt....=/
Also nen totaler anfänger bin ich nicht mehr,sag ich mal...aber eben auch kein profi!
Und mit autopointern habe ich noch NIE gearbeitet
-
Was verwirrt dich denn genau? Verwirrt dich, was eiine Factory ist? Oder die Syntax? Wenn du noch nie Autopointer bzw. allgemein Smartpointer (da gibts neben auto_ptr noch andere) benutzt hast, wird es ja jetzt mal Zeit bzw. es gibt jetzt einen Grund. Denn nur weil man etwas noch nicht benutzt hat, muß man es ja nicht ablehnen.
-
Lass Dich nicht entmutigen! So wild ist das mit den Fabriken nicht. Eine Anwendung der Abstrakten Fabrik kannst Du Dir zum Beispiel so vorstellen:
Es gibt eine abstrakte Klasse Fleischfabrik mit den virtuellen Methoden:- ErstelleWurst
- ErstelleFrikadelle
- ErstelleHackfleisch
Es gibt eine Methode oder Funktion, die mit einem Fleischfabrik-Objekt arbeitet. Je nachdem von welcher Unterklasse der Fleischfabrik ein Objekt übergeben wird, werden Geflügel-, Rind-, Schweine- oder auch Lammfleischprodukte erstellt.
Bei Fabrikmethode gibt es in der abstrakten Klasse ausser virtuellen Methoden auch noch mindestens eine konkrete, die von den virtuellen Gebrauch macht, um Dinge zu erstellen. Bezogen auf das obere Beispiel könnte eine abstrakte Klasse Fleischfabrikmethode noch zusätzlich die konkrete Methode TischleinDeckDich haben, welche dann die jeweiligen Produkte erstellt und damit den Tisch deckt. Wenn es nun eine Methode oder Funktion gibt, die ein Fleischfabrikmethode Objekt erwartet, und die Methode TischleinDeckDich aufruft, wird je nachdem von welche Unterklasse das Objekt ist, der Tisch mit den Produkten, der jeweiligen Fleischsorte gedeckt.
Auto Pointer sind zwar recht praktisch, aber nicht als Container-Elemente geeignet. Hier findest Du eine kurze Beschreibung:
http://www.ica1.uni-stuttgart.de/Courses_and_Lectures/C++/script/node32.html
-
Ich frag mich bloß warum du ihm unbedingt das Fabrik-Pattern erklären willst, wo er doch garnicht danach gefragt hat.