iterator <-> konstruktor konflikt
-
Ich moechte gerne sowas machen:
istream_iterator<PointN> pos1(file); // Anfangsiterator auf die Datei istream_iterator<PointN> end; // Enditerator copy(pos1,end,back_inserter(vBasePoints));Das tut aber nur, wenn mein Konstruktor der Punkteklasse so aussieht:
PointN::PointN() { data = new double[3]; dim = 3; }Mein Defaultkonstruktor sollte aber so aussehen:
PointN::PointN() { data = NULL; dim = 0; }da ich ja nicht bei jedem default punkt speicher anlegen moechte.
Weiss mir da jemand eine Loesung? Kann ich vielleicht den default konstruktor aufrufen und dann eine methode allocate() oder so aufrufen?
-
samo schrieb:
Das tut aber nur, wenn [...]
Ganz schlechtes Deutsch, daran solltest du noch arbeiten.
Ich tippe einfach mal darauf dass du den "Default-Fall" im op>> und/oder op<< oder sonst wo nicht richtig behandelst.
-
samo schrieb:
Mein Defaultkonstruktor sollte aber so aussehen:
PointN::PointN() { data = NULL; dim = 0; }da ich ja nicht bei jedem default punkt speicher anlegen moechte.
Weiss mir da jemand eine Loesung? Kann ich vielleicht den default konstruktor aufrufen und dann eine methode allocate() oder so aufrufen?
Sicher kann man das. Deine Klasse PointN verfügt sicher über einen operator>>; dieser kann friend von PointN sein, also auch auf die privaten Member wie data zugreifen.
std::istream& operator>>( std::istream& in, PointN pt ) { if( !pt.data ) { pt.data = new double[3]; pt.dim = 0; } for( int i = 0; i < pt.dim; ++i ) in >> pt.data[i]; retrun in; }Benutze bitte die Initialisierungsliste bei Konstruktoren. In Deinem Fall etwa so
PointN::PointN() : data( 0 ) // NULL ist noch C , dim( 0 ) {}btw. - hast Du einen Copy-Konstruktor von PointN geschrieben?
Gruß
Werner
-
du kannst in deiner point-klasse data ja auch als double data[3] deklarieren anstatt double *data. dann stellt sich das null-zeiger problem nicht mehr und es wäre in jedem falle effizienter.