Eigentlich trivial: Konstruktoren



  • Hallo Leute.

    Es geht darum - ich habe etwas wie folgende sehr vereinfachte Klasse:

    class test {
        public:
            test(int i);
    };
    

    Was sie macht etc. ist egal - wichtig ist dass nur der eine Konstruktor angeboten wird und Instanzen der Klasse nur mit Übergabe eines int erzeugt werden können.

    Nun habe ich eine zweite Klasse, die als Attribut ein Objekt der Klasse test enthält:

    class testtester {
        test var;
        public:
            testtester(int i) : var(i) {}
            testtester(string filename) {/*...*/}
    };
    

    Der erste Konstruktor ist natürlich i.O. - das Attribut "var" wird gemäß Initialisierer angelegt.

    Mein Problem ist der zweite Konstruktor. Dieser soll das Klassenobjekt erstellen, indem er von "filename" aus einer Datei einliest und var erst nach dem Einlesen von i aus der Datei initialisiert.

    Ist dies möglich so zu realisieren oder muss ich da Zeiger auf test verwenden, um das Lösen zu können?!

    MfG, Unicoder



  • du musst zeiger verwenden.

    var = new test (i);
    


  • Das ist schlecht... Ich mein Zeiger.



  • wieso ist das schlecht. ist doch auch nicht viel anders, außer das du das freigeben nicht vergessen darfst und ab und zu mal auf NULL überprüfen musst 🙂



  • Ist das Dereferenzieren nicht langsam? Bei mir zählt nämlich jeder CPU-Takt 😉



  • das kann ich nicht sagen.

    geht es nicht auch wenn du deine Klasst testtester von der Klasse test ableitest?

    oder du machst in der Klasse test eine set-Methode für den int wert



  • Wäre eine gute Idee, geht aber aus implementierungstechnischen Gründen nicht, da test schon vorgegeben ist (war hier auch nur ein Beispiel)...

    Ableiten geht auch nicht, muss schon ein Attribut sein - also wohl doch Zeiger.



  • wenn du die klasse test nur in einer methode von testtester brauchst kannst du sie auch direkt dort deklarieren, das würde wieder gehen.

    ansonsten: pointer



  • Hallo,

    Dieser soll das Klassenobjekt erstellen, indem er von "filename" aus einer Datei einliest und var erst nach dem Einlesen von i aus der Datei initialisiert.

    int fromFile(const string& f);
    
    class testtester
    {
    ...
    testtester(string filename) : var(fromFile(fileName)) {/*...*/}
    };
    

    Wäre auch eine Möglichkeit.



  • Unicoder schrieb:

    Bei mir zählt nämlich jeder CPU-Takt 😉

    Glaub ich nicht. 😃 😃

    Mit nem vernünftigen Algorithmus lässt sich mehr optimieren als mit hundert
    solcher "Spielereien". Solange du nicht mittels Profiler festgestellt hast
    das deine schlechte Performance genau an solchen Details hängt solltest
    du solche Überlegungen garnicht erst anstellen. 😉


Anmelden zum Antworten