Wie verhält sich eine findGetCopy Methode?
-
sebl11 schrieb:
Deklarieren Sie dazu zuerst eine Methode clone zum Erstellen einer Instanz-Kopie in der Klasse Person nur „rein virtuell“ und als konstant.
[/quote]
Was für ein Müll.Wozu gibt es Copy-Ctors und Zuweisungsoperatoren? Wieso eine factory-methode...? Zeig malPerson.
-
Hacker schrieb:
sebl11 schrieb:
Deklarieren Sie dazu zuerst eine Methode clone zum Erstellen einer Instanz-Kopie in der Klasse Person nur „rein virtuell“ und als konstant.
Was für ein Müll. Wozu gibt es Copy-Ctors und Zuweisungsoperatoren?
Wie erstellst du eine Kopie einer abgeleiteten Klasse, wenn du nur einen Basisklassenzeiger hast? Und antworte jetzt nicht mit dynamic_cast oder typeid!
-
OK hier ist die Klasse Person:
Person.h
#include <string.h> #include <iostream> #ifndef PERSON_H #define PERSON_H using namespace std; class Person { public: Person( string const name ); ~Person(); const string getName() const; Person(const Person &p); virtual void printStream(std::ostream &os) const; bool operator==(const string &s) const; protected: private: string name; //Person *next; }; bool operator== (const string &s, const Person &p); //bool operator== (const Person &p2, const string &s); ostream& operator<<( ostream &ps, const Person &p); #endif //PERSON_HPerson.cpp:
#include "Person.h" #include "eClass.h" #include <iostream> #include <ostream> #include <cstring> #include <typeinfo> using namespace std; Person::~Person() { //cout << "dtor:" << name << ":" << this << endl; } Person::Person( string const name ) { //next = NULL; if (name.empty()) //Überprüfung ob kein Name übergeben wird { throw eClass("name", typeid(name).name()); } Person::name = name; //Speicher freigabe mit herausfinden von der Länge des Namen //cout << "ctor:" << Person::name << ":" << this << endl; } Person::Person(const Person& ) { Person::name = name; } const string Person::getName() const { //cout << "getName:" << name << ":" << this << endl; return name; } void Person::printStream(std::ostream &os) const { os << name << endl; } bool Person::operator==(const string &s) const { return s==name; }
-
SeppJ schrieb:
Hacker schrieb:
sebl11 schrieb:
Deklarieren Sie dazu zuerst eine Methode clone zum Erstellen einer Instanz-Kopie in der Klasse Person nur „rein virtuell“ und als konstant.
Was für ein Müll. Wozu gibt es Copy-Ctors und Zuweisungsoperatoren?
Wie erstellst du eine Kopie einer abgeleiteten Klasse, wenn du nur einen Basisklassenzeiger hast? Und antworte jetzt nicht mit dynamic_cast oder typeid!
Ich mach die Basisklasse Virtual oder nicht?
-
sebl11 schrieb:
Ich mach die Basisklasse Virtual oder nicht?
Du kannst eine Klasse nicht virtuell machen. Falls du virtuelle Vererbung meinst: Das ist ein komplett anderes Konzept, das mit Kopien nichts zu tun hat.
-
sebl11 schrieb:
SeppJ schrieb:
Hacker schrieb:
sebl11 schrieb:
Deklarieren Sie dazu zuerst eine Methode clone zum Erstellen einer Instanz-Kopie in der Klasse Person nur „rein virtuell“ und als konstant.
Was für ein Müll. Wozu gibt es Copy-Ctors und Zuweisungsoperatoren?
Wie erstellst du eine Kopie einer abgeleiteten Klasse, wenn du nur einen Basisklassenzeiger hast? Und antworte jetzt nicht mit dynamic_cast oder typeid!
Ich mach die Basisklasse Virtual oder nicht?
Welche Sprache ist denn das? o.O
@SeppJ: Wenn ich verstanden hab was du meinst:
Zuweisungsoperator polymorph machen, Zuweisung durchführen:AbtgeleiteteKlasse a = *Zeiger;
-
Hacker schrieb:
Zuweisungsoperator polymorph machen, Zuweisung durchführen:
AbtgeleiteteKlasse a = *Zeiger;
-
Welche Sprache ist denn das? o.O
@SeppJ: Wenn ich verstanden hab was du meinst:
Zuweisungsoperator polymorph machen, Zuweisung durchführen:AbtgeleiteteKlasse a = *Zeiger;na c++
-
Hacker schrieb:
AbtgeleiteteKlasse a = *Zeiger;Und woher weißt du, dass links ein AbgeleiteteKlasse steht? Der Code soll schließlich für alle Objekttypen funktionieren.
Worauf ich hinaus will: Du warst mit deinem "Müll" etwas voreilig.
-
Hacker schrieb:
Zuweisungsoperator polymorph machen
Zeig mir auch nur einen Fall, wo das sinnvoll ist.
-
SeppJ schrieb:
Hacker schrieb:
AbtgeleiteteKlasse a = *Zeiger;Und woher weißt du, dass links ein AbgeleiteteKlasse steht? Der Code soll schließlich für alle Objekttypen funktionieren.
Worauf ich hinaus will: Du warst mit deinem "Müll" etwas voreilig.
War ich auf jeden fall. Aber ich muss überhaupt nicht wissen, ob links eine steht, ich verstehe das Problem nicht...

struct Base { virtual Base& operator=(Base const&) {return *this;} }; struct Derived : public Base { Derived& operator=(Base const& b) {return *this;} }; int main() { Base *ptr = new Derived; Derived derived; //... derived = *ptr;//Zuweisung delete ptr; }So meinte ich das ganze. Ob das sinnvoll ist: was weiß ich? Das man aber so keine Factory-Methode braucht.
@TE: Na wie siehts aus? Wo willste denn etwas finden, ich nehme an es gibt irgendein Array, in dem alle Instanz-Adressen aufgelistet sind oder so?
-
Hacker, implementier doch mal, was die Aufgabe verlangt hat (aber der Einfachheit ohne find):
Base* GetCopy(Base*);
-
Hacker schrieb:
Ob das sinnvoll ist: was weiß ich?
Wenn du es nicht weisst, dann schlage bitte in Zukunft nicht entsprechende Lösungen vor.
Was soll in deinem Beispiel passieren, wenn ein
BaseeinemDerivedzugewiesen wird? Das kompiliert nämlich, obwohl so eine Operation nicht vernünftig implementiert werden kann.
-
Hacker schrieb:
Zuweisungsoperator polymorph machen, Zuweisung durchführen:
Happy Slicing

-
Hacker schrieb:
Derived& operator=(Base const& b) {return *this;}Damit hast du jetzt den Derived-Teil kopiert, aber nicht den Base-Teil. Ups.
Die Aufgabenstellung ist mir im übrigen auch nicht klar.
-
Edit: gelöscht.
-
Falls ich es richtig verstanden habe, hier mal ein etwas unsinniges Beispiel.

#include <iostream> #include <memory> #include <string> #include <vector> class Frucht; typedef std::shared_ptr<Frucht> FruchtPtr; class Frucht { public: inline virtual ~Frucht() { } inline virtual std::string const& name() const { static std::string name("Frucht"); return name; } inline virtual FruchtPtr clone() const { return FruchtPtr(new Frucht()); } }; class Apfel : public Frucht { private: std::string m_sorte; public: inline Apfel(std::string const& sorte) : m_sorte(sorte) { } inline virtual std::string const& name() const { return m_sorte; } inline virtual FruchtPtr clone() const { return FruchtPtr(new Apfel(m_sorte)); } }; class Birne : public Frucht { private: std::string m_sorte; public: explicit inline Birne(std::string const& sorte) : m_sorte(sorte) { } inline virtual std::string const& name() const { return m_sorte; } inline virtual FruchtPtr clone() const { return FruchtPtr(new Birne(m_sorte)); } }; typedef std::vector<FruchtPtr> FruchtContainer; inline FruchtPtr findeFruchtUndKopiere(FruchtContainer fruechte, std::string const& name) { for(FruchtContainer::iterator begin = fruechte.begin(), end = fruechte.end(); begin != end; ++begin) { if((*begin)->name() == name) return (*begin)->clone(); } return FruchtPtr(); } int main() { FruchtContainer fruechte; fruechte.push_back(FruchtPtr(new Apfel("Granny Smith"))); fruechte.push_back(FruchtPtr(new Apfel("Cox Orange"))); fruechte.push_back(FruchtPtr(new Apfel("Golden Delicious"))); fruechte.push_back(FruchtPtr(new Apfel("Gala"))); fruechte.push_back(FruchtPtr(new Birne("Fruehe von Trevoux"))); fruechte.push_back(FruchtPtr(new Birne("Clapps Liebling"))); fruechte.push_back(FruchtPtr(new Birne("Stuttgarter Geisshirtle"))); fruechte.push_back(FruchtPtr(new Birne("Williams Christ"))); FruchtPtr apfel(findeFruchtUndKopiere(fruechte, "Gala")); if(apfel) std::cout << apfel->name() << " gefunden !\n"; else std::cout << "Nichts gefunden ...\n"; FruchtPtr birne(findeFruchtUndKopiere(fruechte, "Gute Graue")); if(birne) std::cout << birne->name() << " gefunden !\n"; else std::cout << "Nichts gefunden ...\n"; }
-
Also erstmal danke für die antworten

aber trotzdem sehe ich nicht mehr ganz durch was ihr schreibt

-
Was verstehst du denn an meinem Beispiel nicht?
-
sebl11 schrieb:
Also erstmal danke für die antworten

aber trotzdem sehe ich nicht mehr ganz durch was ihr schreibt

Das liegt da dran, weil niemand auf deine Frage geantwortet hat, sondern sich stattdessen eine Randdiskussion entwickelt hat. Warum dir niemand geantwortet hat?
1. Weil du nicht die als wichtig gekennzeichneten Threads im Forum gelesen hast (besonders "Du brauchst Hilfe").
2. Weil die regelmäßigen Forenteilnehmer dich schon kennen und wissen, dass du schon eben so oft wegen deiner unbrauchbaren Fragen abgemahnt wurdest, wie du Threads eröffnet hast. Trotzdem hat sich immer noch nichts geändert.
3. Weil Die regelmäßigen Forenteilnehmer dich schon kennen und wissen, dass du nicht einmal versuchst, Antworten zu verstehen oder dich fortzubilden sondern nur auf eine Komplettlösung wartest. Und selbst wenn du eine Komplettlösung bekommst, nimmst du sie nicht an, wenn sie nicht exakt deinen Vorgaben entspricht, da du sie nicht verstehst und deshalb nicht ändern kannst.