Container für vtkSmartPointer



  • Hallo,

    Container & Co wurden ja schon mehrfach diskutiert ABER...
    Ist es möglich mehrere vtk-Objekte mit vtkSmartPointern zu erzeugen UND
    die die Adressen der Objekte dann in einem "Feld" dafür zu hinterlegen, sodass andere Funtionen problemlos darauf zugreifen können???

    Also in etwa so...

    class Klasse
    {
        private:
        vtkSmartPointer<vtkActor> FeldFuerSmartPointerAdressen;
    
        public:
        Klasse();
        void funktion();
    }
    
    Klasse()
    {
         FeldFuerSmartPointerAdressen = vtkSmartPointer<vtkActor>::New() [5];
    }
    
    void Klasse::funktion()
    {
        macht irgendwas...;
        vtkSmartPointer<vtkActor> actor1 = vtkSmartPointer<vtkActor>::New();
        FeldFuerSmartPointerAdressen[0] = actor1;
    }
    

    Über google bin ich auf die Klasse "vtkSmartPointerBase" gestoßen versteh aber nicht wie die eingesetzt werden kann vllt ist das auch am Problem vorbei.
    Weiss irgendwer Rat?

    Gruß

    Ich



  • Es geht mir nur darum eine Möglichkeit zu finden vtkObjekte mit einer Funktion durch mehrfachen Aufruf der Funktion zu erzeugen und mit einer anderen Funktion diese nacheinander aufzurufen ohne dass von Beginn an klar ist, wie viele Objekte erzeugt werden.

    Das Problem ist anscheinend, dass diese Typen wie vtkActor oder vtkAssembly oder was auch immer komplexer und damit iwie schwerer zu "greifen" sind als die einfachen datentypen wie int, double usw...

    hat jemand ne Idee?



  • Ich versteh nicht so ganz, was du sagen willst, und auch nicht, was dein Problem ist. Du redest von Containern. Warum benutzt du dann keine? Warum nicht std::vector<vtkSmartPointer<vtkActor>>? Und was ist jetzt das Problem?



  • Vor allem, was sind vtkObjekte und -SmartPointer?
    Bzw. was ist so besonders oder anders an ihnen?



  • std::vector<vtkSmartPointer<vtkObjectBase>>
    ?

    Oder auch
    std::map<std::string, vtkSmartPointer<vtkObjectBase>>
    bzw. was auch immer du brauchst damit du so auf die "Objekt-Liste" zugreifen kannst wie es nötig ist.

    Bzw. falls alle Objekte die du damit verwalten willst eine "konkretere" gemeinsame Basisklasse als vtkObjectBase haben, solltest du natürlich diese verwenden.



  • @hustbaer & @Mechanics: vielen Dank, das funktioniert super! Stand iwei aufm Schlauch 😃

    @Skym0sh0 ersteres sind Instanzen von zu VTK gehörenden Klassen wie vtkActor und vtkSmartPointer sind Zeiger, die im Gegensatz zum gewöhnlichen Stern-Zeiger selbst merken wenn sie nicht mehr gebraucht werden und dann automatisch den Speicherplatz freigeben (ziemlich praktisch)



  • gerade ergibt sich eine anschlussfrage bei der ich nicht weiterkomme. ich hab folgendes erstellt:

    class Klasse
    {
    ...
    private:
    std::vector<vtkSmartPointer<vtkActor>>* m_actors;
    ...
    }
    
    Klasse::Klasse()
    {
    ...
    m_actors = new std::vector<vtkSmartPointer<vtkActor>>;
    ...
    }
    
    Klasse::funktion()
    {
    vtkSmartPointer<vtkActor> actor = vtkSmartPointer<vtkActor>::New();
    actor->SetMapper(mapper);
    actor->SetUserTransform(transformation);
    actor->SetProperty(properties);
    
    //step6: append the modeled link as actor to the global actor-list
    m_actors->push_back(actor);
    }
    

    Wenn beim Debuggen das Programm mit Haltepunkten durchlaufen wird, dann stellt sich direkt nach dem Hinzufügen des in der Funktion erstellten actors zum Vektor m_actors folgender Fehler ein:

    ((((((vtkSmartPointerBase)(&(*m_actors)._Myfirst[0x00000000]))).Object)).WeakPointers) CXX0030: Fehler: Ausdruck kann nicht ausgewertet werden

    Die Vorschläge zur Problembehebung von Microsoft (https://msdn.microsoft.com/de-de/library/7cw9d870(v=vs.100).aspx) helfen hier glaub ich nicht weiter, da Typnamen vorhand sind und die Deklaration auch da ist. Habt ihr eine Idee?


  • Mod

    Ein Pointer auf einen Vector? 😮



  • ja sonst muss doch jedes mal beim übertragen woandershin der ganze vektor überstellt werden anstatt nur der adresse ???? 😃



  • Es kommt aber drauf an.

    Wenn deine Klasse, die den Vektor innhat, kopierbar sein soll und auch ihre Daten (die in dem Vektor liegen) verändern können soll, dann ist nur die Adresse kopieren der falsche Weg.

    Wenn du umgekehrt teure Kopien nicht haben willst, und auch gar nicht brauchst, dann sorge dafür,d ass nix kopiert wird. Und zwar nicht innerhalb der Klasse sonder ausserhalb. Eben indem du keine Kopien machst.

    Und zu guter letzt gibts noch das Moven von Objekten, was öfters auch mal was Speed gibt.

    Edit: Mit Zeiger auf Vektor von Zeigern auf Zeiger auf X bist du ganz schnell ein 3- oder sogar 5-Sterne-Programmierer...
    Egal, ob die smart sind oder nicht. Die OOP gibt dir dafür Klassen zur Hand, die Funktionalität wegkapseln.


  • Mod

    bleifrei schrieb:

    ja sonst muss doch jedes mal beim übertragen woandershin der ganze vektor überstellt werden anstatt nur der adresse ???? 😃

    Das ist eben eine solch merkwürdige Idee (und keine legitime Lösung für dein Problem), dass ich davon ausgehen, dass, wer so etwas versucht, es nicht richtig macht. Zumal du ja anscheinend schon einmal von Smartpointern gehört hast, aber hier trotzdem keinen nutzt. Das soll keine Aufforderung sein, das nun mit einem Smartpointer auf einen Vector zu machen, es ist bloß eine Beobachtung, dass du vermutlich auf dem Gebiet manueller Speicherverwaltung nicht so ganz fit bist.


Log in to reply