Struct in Vector speichern



  • Hi,

    ich bin mir nicht sicher, aber wandle mal dein struct in class um und schau ob es dann funktioniert. Falls ja liegt es vermutlich am allocator.

    template < class T, class Allocator = allocator<T> > class vector
    

    http://www.codeguru.com/cpp/cpp/cpp_mfc/stl/article.php/c4079/



  • anonymus_110 schrieb:

    ich bin mir nicht sicher, aber wandle mal dein struct in class um und schau ob es dann funktioniert. Falls ja liegt es vermutlich am allocator.

    Nein das hat damit nichts zu tun. struct und class unterscheiden sich einzig durch den default Zugriff (public für struct, private für class) und sind sonst absolut identisch.



  • vector<Proc> processes;
    processes.push_back( Proc(arrival_time, cpu_time) );
    


  • evilissimo schrieb:

    vector<Proc> processes;
    processes.push_back( Proc(arrival_time, cpu_time) );
    

    Danke, so funktioniert es tatsächlich 🙂
    Geht das nicht, dass man den Struct vorher einer Variable zuweist und gegebenenfalls noch weiterverarbeitet bevor man ihn in dem Vector speichert?



  • Hä? Doch klar geht das, zeig doch mal was du hast 🙂 .



  • sili schrieb:

    vector<Proc> processes;
    Proc* p = new Proc(arrival_time, cpu_time);
    processes.push_back(p);
    

    Dies führt nun aber zu folgender Fehlermeldung:
    - error: no matching function for call to 'std::vector<Proc, std::allocator<Proc> >::push_back(Proc*&)'

    So 😉



  • sili schrieb:

    vector<Proc> processes;
    Proc* p = new Proc(arrival_time, cpu_time);
    processes.push_back(p);
    

    p ist ein Zeiger, und "processes" enthält Objekte. Merkst du das was das Problem ist?

    Entweder verwendest du einen Vektor auf Zeiger oder Objekte (Im Falle von Zeigern, musst du diese natürlich später auch mit delete selbst freigeben).



  • asc schrieb:

    Entweder verwendest du einen Vektor auf Zeiger oder Objekte

    Warum? Geht doch:

    #include <iostream>
    #include <vector>
    
    struct Person
    {
    	Person(const std::string ctorName) :
    		name(ctorName) { }
    
    	std::string name;
    };
    
    int main()
    {
    	Person *person = new Person("Pedda");
    
    	std::vector<Person> personenVec;
    
    	personenVec.push_back(*person);
    
        delete person;
    
    	std::cin.get();
    }
    


  • Danke mit *p funktioniert es. Ich hätte schwören können, dass ich das bereits probiert habe... 😉



  • Kóyaánasqatsi schrieb:

    asc schrieb:

    Entweder verwendest du einen Vektor auf Zeiger oder Objekte

    Warum? Geht doch:

    Verwirr hier bitte niemanden. Das mischen geht weiterhin nicht (Ohne Dereferenzierung Zeiger einen Objekt, oder Objekt einem Zeiger zuweisen).



  • asc schrieb:

    und "processes" enthält Objekte.
    ...
    Entweder verwendest du einen Vektor auf Zeiger oder Objekte

    Ich will nur erwähnen, dass Du scheinbar unter "Objekt" etwas anderes verstehst als der C++ Standard. Es gibt auch Objekte von anderen (nicht-Klassen) Typen (int, void*, double, bool(*)(int), ...).

    Gruß,
    SP



  • Sebastian Pizer schrieb:

    Ich will nur erwähnen, dass Du scheinbar unter "Objekt" etwas anderes verstehst als der C++ Standard...

    Die Kritik nehme ich an, wenn auch nicht Kritiklos: Noch kein einziger in meiner gesamten Berufslaufbahn (überwiegend C++, bei mehr als 10 Jahre Berufserfahrung) hat den Begriff Objekt, in den Gebrauch des C++ Standards, sondern eher bezogen auf die Objektorientierte Programmierung (Instanz einer Klasse) verwendet. Es gibt bei mir eine Grenze bei der mir der Standard abgeht: Und zwar wenn der Sprachgebrauch im Programmierbereich in 90%+ der Fälle etwas anderes besagt. Vielleicht liegt es auch daran das ich nicht im Lehrbereich tätig bin...



  • asc, das hast du auch gesagt, als ich dich auf die Terminologie von "konstanten Referenzen" hingewiesen habe. Hier im Forum nehmen wir es halt gerne etwas genau... 😉



  • asc schrieb:

    sondern eher bezogen auf die Objektorientierte Programmierung (Instanz einer Klasse) verwendet.

    Einspruch. Objektorientierte Programmierung heißt vermutlich nicht, daß man alles in Klassen stopft.

    asc schrieb:

    Vielleicht liegt es auch daran das ich nicht im Lehrbereich tätig bin...

    Der Lehrbereich hinkt dem Geschehen meist viele Jahre hinterher.



  • volkard schrieb:

    asc schrieb:

    sondern eher bezogen auf die Objektorientierte Programmierung (Instanz einer Klasse) verwendet.

    Einspruch. Objektorientierte Programmierung heißt vermutlich nicht, daß man alles in Klassen stopft.

    Ansichtssache. Ich denke nicht so, aber mein Prof tut das auch so. OO sind Klassen, Vererbung, Polymorphie, Generik. (siehe Eiffel -> alles ist eine Klasse).



  • Hauptsache, es führt nicht zu sowas wie

    Objektorientiert:

    struct Matrix{
       float** data;
    };
    void invertiere(Matrix m){
       //gauss
    }
    

    Nicht objektorientiert:

    typedef float** Matrix;
    
    void invertiere(Matrix m){
       //gauss
    }
    


  • ^^
    Oder noch schlimmer.

    class Math
    {
     public:
     float sin ( float x );
     float cos ( float x );
     //...
    };
    
    class uses_math : public Math
    {
     public:
     void bar ()
     {
       float x = sin ( 0.5f );
     }
    };
    


  • drakon schrieb:

    Generik

    Neues Wort?



  • volkard schrieb:

    drakon schrieb:

    Generik

    Neues Wort?

    Öhh, nö?
    http://de.wikipedia.org/wiki/Generik



  • drakon schrieb:

    volkard schrieb:

    drakon schrieb:

    Generik

    Neues Wort?

    Öhh, nö?
    http://de.wikipedia.org/wiki/Generik

    Öhm doch!
    http://de.wikipedia.org/w/index.php?title=Generizität&redirect=no
    (Ist doch nur Wikipedia und kein Lexikon)


Anmelden zum Antworten