Klasse umbauen, damit man mehrere Instanzen anlegen kann
-
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
-
nillable schrieb:
Kopiererei!
Zeiger ist kleiner.
=> weniger Kopierereimag 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!
-
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 ausgegebenMan 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