Klasse umbauen, damit man mehrere Instanzen anlegen kann



  • std::vector<Person*> personen;
    
    // Nachfolgendes kannst du so oft machen wie du willst:
    Person* p = new Person();
    personen.push_back(p);
    

    Du solltest dich mit den Containern der STL beschäftigen, da die STL einfach jeder C++ Programmierer kennen muß.



  • Artchi schrieb:

    std::vector<Person*> personen;
    // Nachfolgendes kannst du so oft machen wie du willst:
    Person* p = new Person();
    personen.push_back(p);
    

    Warum denn mit Pointern?

    std::vector<Person> personen;
    // Nachfolgendes kannst du so oft machen wie du willst:
    Person person("Hans", "Meyer");
    personen.push_back(person);
    
    // oder auch so;
    personen.push_back(Person("Hans", "Meyer"));
    


  • hehejo schrieb:

    Warum denn mit Pointern?

    http://www.cpp-tutor.de/cpp/le18/le18_01.htm



  • Innerhalb der main.cpp erstelle ich eine Instanz von einer Person, wenn ich Person Instanzname mache.

    Person ErstePerson;

    So zum Beispiel.... bis hierhin ist es doch richtig oder ?



  • Das ist falsch! Hast du dir nicht unsere Antworten durchgelesen, wie man das macht??? Bitte nochmal meine Antwort von oben durchlesen.



  • Artchi schrieb:

    Das ist falsch! Hast du dir nicht unsere Antworten durchgelesen, wie man das macht??? Bitte nochmal meine Antwort von oben durchlesen.

    Ich raffs trotzdem nicht, wieso ist Person p und dann push_back so viel schlechter als Person *ptrP = new Person und dann push_back?!

    Entweder speichert die liste sofort den pointer oder, wenn man eine instanz übergibt, wird speicher geholt und das objekt intern (wieder als pointer) gespeichert.

    Ich hab jetzt keine Lust die ganzen Seiten zu wälzen nur damit ich herausfinde was du meinst.



  • Kopiererei!
    Zeiger ist kleiner.
    => weniger Kopiererei


  • Mod

    nillable schrieb:

    Kopiererei!
    Zeiger ist kleiner.
    => weniger Kopiererei

    mag sein (wobei man einiges sparen könnte, wenn man move konstruktoren verwendet und push_back mit unbenannten objekten füttert). aber der aufwand, korrekt damit (pointer-vektor) umzugehen ist grösser. und die syntax ist auch hässlich. jede menge sternchen und klammern. zusätzlich besteht das problem, ownership korrekt zu implementieren, so dass theoretisch ein smart-pointer gebraucht wird - was seinerseits zu overhead führen dürfte. solange der erhöhte aufwand beim kopieren kein problem darstellt - und die problembeschreibung lässt das zunächst vermuten - würde ich die finger von pointer-containern lassen.



  • Hat einer von euch, das hier mal benutzt ?

    MeineListe->AddObject(.....);

    Wenn ja, wie hat er es eingesetzt und was weiß er darüber ansonsten. Muss man bestimmte Sachen beachten ?



  • wenn er jetzt einfach den vector so definiert

    std::vector<&Person> meinePersonen;
    
    Person a;
    ...
    
    meinePersonen.push_back(a);  // hier ist doch auch nur eine referenz und das objekt ist nicht doppelt, oder? oder geht das nur bei trivialen datentypen
    


  • ne, is keine referenz, is ne kopie, auch bei einfachen typen

    probier das mal:

    #include <iostream>
    #include <vector>
    
    using namespace std;
    
    int main()
    {
    	int i=3;
    	vector<int> vec;
    
    	vec.push_back(i);
    	vec[0]=12;
    
    	cout<<i<<endl;
    	cout<<vec[0]<<endl;
    
    	cin.get();
    }
    

    dass das ne kopie ist, steht in dem link http://www.cpp-tutor.de/cpp/le18/le18_01.htm, den miller_m gepostet hat gleich an erster stelle!


  • Mod

    jaaber schrieb:

    wenn er jetzt einfach den vector so definiert

    std::vector<&Person> meinePersonen;
    
    Person a;
    ...
    
    meinePersonen.push_back(a);  // hier ist doch auch nur eine referenz und das objekt ist nicht doppelt, oder? oder geht das nur bei trivialen datentypen
    

    das geht nicht. man kann keine referenzen mit stl-containern verwenden - selbst wenn es möglich wäre, wäre das ergebnis hier wohl kaum das, was du willst. a wird ja zerstört wenn der block verlassen wird, die referenz würde länger leben und auf etwas zeigen, das nicht mehr existiert.



  • 1. Die Objekte wären nicht polymorphiefähig, was in einigen Situationen nicht gerade hilfreich wäre.
    2. Wen einfache Pointer stören, kann/soll Smartpointer benutzen, z.B. boost::shared_ptr.



  • an camper:

    Geht folgender code?

    class Person{
     //...
     void print() {std::cout << name ;}
     std::string name;
    };
    
    int main()
    {
      std::vector< Person > vect;
      {  //Block hier gemacht nur um die Instanz 'p' lokal zu definieren
         Person p("Hans"); 
         vect.push_back(p);
      }
      //hier existiert p("Hans") nicht mehr da es aus seinem Gültigkeitsbereich 
      //raus ist
      std::cout << vect[0].print() << std::endl;
    
    }
    

    Was druckt dieses Programm aus?
    (Anmerkung: Wir nehmen an die Klasse Person hat einen operator << definiert)

    Antwort: es wird "Hans" audrucken ?
    Warum: vector KOPIERT sich die Instanz der Klasse, und obwohl die Instanz gar nicht mehr existiert, es wird korrekt ausgegeben 😉

    Man kann also ruhig vector <Person > bauen.

    Nik0n



  • ich find kopieren in diesem fall gut 👍

    weniger code, sicherer code, besserer code. und den copy ctor optimiert der compiler eh weg 👍


Anmelden zum Antworten