Constructor - Variablen Problem



  • Hallo zusammen,
    ich hatte dieses problem nun schon mehrfach und verstehe nicht warum.. Hoffe ihr koennt mir da weiterhelfen:

    Ich habe eine Klasse mit member-variablen (z.B. pointer zum float array). Dazu habe ich zwei konstruktoren, wobei der eine aber am Ende auch noch den anderen aufruft. Wenn ich nun die member-variablen nur im zweiten konstruktor belege weiss das letztendliche objekt nichts davon. Hier ein beispiel:

    Member variablen:
      float* pFeatVec;
      int dimension;
    
    FeatureVector::FeatureVector(ConfigReader* crd2) {
            //do something..to assign an int to dimension
            FeatureVector(dimension);
    }
    
    FeatureVector::FeatureVector(int dim) {
            pFeatVec = new float[dim];
            for(int i=0;i<dimension;i++) pFeatVec[i]=0;
    }
    

    Wenn ich nun also ein neues Objekt erstelle mit z.B.

    FeatureVector* test = new FeatureVector(&confReader);
    

    dann verhaelt sich das programm als ob pFeatVec nie initialisiert und gefuellt worden waere..Genau das verstehe ich nicht. Beide Konstruktoren greifen auf die gleiche member-variable zu, warum also sind die aenderungen die der zweite konstruktor an ihnen vornimmt nicht sichtbar wenn er vom ersten aufgerufen wurde?

    Um das ganze zu loesen muesste ich nun also folgendes schreiben:

    FeatureVector::FeatureVector(ConfigReader* crd2) {
             //whatever gives dimension a value...
            pFeatVec = new float[dimension];
            FeatureVector(dimension);
    }
    
    FeatureVector::FeatureVector(int dim) {
            dimension = dim;
            pFeatVec = new float[dimension];
            for(int i=0;i<dimension;i++) pFeatVec[i]=0;
    }
    

    was natuerlich ziemlicher scheisscode ist weil ich pFeatVec zweimal zuweisen muss... Das ganze gilt natuerlich auch im einfacheren Fall einer int-variable. Wenn ich sie nur im zweiten konstruktor zuweise ist es am ende im Objekt als haette ich das nie getan...

    Bitte macht meinem Unwissen ein Ende.. Danke schon einmal

    Tim



  • Die Antwort ist bestechend einfach: Du rufst hier nicht den anderen Konstruktor auf, das geht nämlich in C++ nicht (das reicht als Antwort auf die Frage an sich).

    Was dort passiert: Es wird ein neues, temporäres FeatureVector-Objekt erzeugt, dass Du nicht benutzt, d.h. es wird noch in derselben Zeile wieder zerstört.

    Diese Frage sollte in den Thread der meistgestellten 😉



  • Eine Lösung für dieses Problem ist: Erzeuge eine private Funktion (z.Bsp. init) die diese Initialisierung macht und von beiden Konstruktoren aufgerufen wird.


Anmelden zum Antworten