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.


Anmelden zum Antworten