Wie verhält sich eine findGetCopy Methode?



  • Hallo Leute,
    meine Frage ist wie sich eine findGetCopy Methode verhält?

    Danke schonmal im vor raus 🙂
    sebl11



  • sebl11 schrieb:

    findGetCopy

    Was ist denn das? WinAPI Müll Zeugs?

    Egal. Der Name suggeriert doch schon, dass es sich um eine Methode handelt, die aus evt. einem start-end-iterator Paar (ich hab keine Ahnung, ich rate gerade) alle Vorkommen eines Wertes kopiert (was für ein Schwachsinn, dann kannst du doch gleich den zu findenden Wert nehmen) und irgendwohin (vllt. vor einen Output-Iterator) kopiert.

    Was meinst du denn? Ich kann im Netz nix finden.



  • Also ich weiß nicht was das ist, weil wir beim studium eine Aufgabe mit findgetcopy bekommen haben und diese implementieren müsssen.

    Hier mal die Aufgaben stellung:

    Implementieren Sie eine Methode findGetCopy, um als Ergebnis eine Kopie der gefundenen Instanz zu erhalten.

    Deklarieren Sie dazu zuerst eine Methode clone zum Erstellen einer Instanz-Kopie in der Klasse Person nur „rein virtuell“ und als konstant. Implementieren Sie diese Methode dann passend in den abgeleiteten Klassen.



  • 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 mal Person .


  • Mod

    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_H
    

    Person.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++


  • Mod

    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?


  • Mod

    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 Base einem Derived zugewiesen 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";	
    }
    

Anmelden zum Antworten