Objekte clonen ?



  • Bestimmt etwas komisch die Frage aber kann man wenn man ein Objekt erstellt hat von dem Zeiger des Objektes ein neues Objekt erstellen ?
    Mittels typeid oder so ?

    MFG
    xmarvel



  • Nochmal ganz langsam bitte.

    ein typeof gibt es nicht:

    Foo* p=new Foo(bar);
    //...
    typeof(p) p2=new typeof(p)(*p);
    

    wenn du soetwas meinst: das geht nicht.



  • ja sowas meinte ich.
    Ne andere Möglichkeit gibt es warscheinlich auch nicht oder ?

    Edit: Würde es etwas nützen wenn man das Objekt von einer Basisklasse erzeugt wurde und man die Basisklasse mit annhemen kann ?



  • nein, dass geht so nicht.

    Du kannst aber wenn du den GCC hast oder auf den neuen C++ Standard wartest folgendes machen

    typeof(*obj) new_obj;
    

    <edit>boa, ich hab 8Minuten für so eine kurze Antwort gebraucht, nur weil ich das vorher noch ausprobieren wollte :)</edit>



  • xmarvel schrieb:

    ja sowas meinte ich.
    Ne andere Möglichkeit gibt es warscheinlich auch nicht oder ?

    Ne, gibts leider nicht.

    Aber manchmal(!) reichen hier templates

    template<typename T>
    T* clone(T* p)
    {
      return new T(*p);
    }
    
    //...
    Foo* p=new Foo(bar);
    clone(p)->something();
    


  • thx für die Antworten
    @kingruedi
    Das funktioniert genau so wie ich es eigentlich wollte.

    Leider hatte ich ein Denkfehler drin. Da die Objekte die ich erzeugen will ich per dlopen (Plugin System unter Linux) mir erzeuge diese sind alle abgeleitet von der Basisklasse.
    Leider wird mit dem Befehl logischerweise die Basisklasse erzeugt und nicht die abgeleitet Klasse.
    Kleiner Code zur Veranschauigung:

    class Basis {
    public: 
       virtual bla();
    };
    
    class Abgeleitet : public Basis { //Ist als Plugin geschrieben die später geladen wird. (.so lib)
    public:
       bla();
    };
    extern "C" Basis* create() {
        return new Abgeleitet;
    }
    
    //...
    create_t* create_library = (create_t*) dlsym(library, "create"); // lädt die Abgeleitet Klasse
    Basis *foo= create_library(); // erstellt das Objekt
    
    // In einer anderen Klasse irgendwo im System wollte ich eigentlich vom erstellten Objekt ne Kopie davon machen
    
    typeof(*foo) new_obj; // Ist aber eben die Basisklasse die erstellt wird
    new_obj->bla();
    

    Naja dann muss ich das eben irgendwie anders lösen aber thx nochmal

    MFG
    xmarvel



  • Wie wäre es zB mit

    class Basis {
    public:
      virtual Basis *clone () = 0;
      virtual ~Basis () {}
    };
    
    class Foo : public Basis {
    public:
      Foo *clone () { return new Foo; }
    };
    
    class Bar : public Basis {
    public:
      Bar *clone () { return new Bar; }
    };
    
    int main () {
       Basis *b = new Foo;
       Basis *x = b->clone();
    }
    


  • @davie
    ja das würde natürlich gehen so werde ich das auch warscheinlich auch machen müssen oder die Lib jedes mal neu laden. <- was sehr unschön ist.
    Nur hätte ich bei der Lösung zwei gleiche Methoden einmal ein extern "C" Funktion die den Zeiger zurückgibt und noch eine Klassenmethode die genau das gleiche macht.
    Ich muss ne Funktion extern "C" erstellen weil dlopen und dlsym nur Funktionen in C laden kann und keine Klassen. 😞 siehe auch dlopen mini Howto

    MFG
    xmarvel


Anmelden zum Antworten