Konstruktor mit dem Parameter+Vererbte Klassen



  • Hallo,

    ich habe 3 Klassen: Fsm, State, ImportUnprocessedState.

    ImportUnprocessedState ist eine verebte Klasse von State.
    Mein Konstruktor von Fsm sieh so aus:

    Fsm(State* state);

    Definition:

    Fsm::Fsm(State* state)
    {
    m_state = state; ////State* m_state;
    
    }
    

    Ich möchte jetzt ein Object der Fsm Klasse erstellen:

    ImportUnprocessedState importState = new ImportUnprocessedState();
    Fsm importFsm = new Fsm(&importState);
    

    Ich habe aber diese fehler
    C2440 Initialisierung ImportUnprocessedState* kann nicht in ImportUnprocessedState konvertiert werden
    und dasselbe für Fsm

    Was mache ich falsch?



  • importState und importFsm sind halt normale Objekte und keine Zeiger - nur letztere können mit new initialisiert werden.



  • mit "new" werden Pointer erzeugt.



  • ok wieso kann ich sowas nicht schreiben:

    Fsm importFsm(new ImportUnprocessedState());

    Ich übergebe einen Pointer auf die Klasse. Ich habe viele Linker errors.


  • Mod

    koschka schrieb:

    ok wieso kann ich sowas nicht schreiben:

    Fsm importFsm(new ImportUnprocessedState());

    Ich übergebe einen Pointer auf die Klasse. Ich habe viele Linker errors.

    Fehler treten auf, wenn das Programm als ganzes fehlerhaft ist, und nicht notwendigerweise an der Stelle, die du gerade betrachtest. Manchmal ist auch nicht das, was dasteht, das Problem, sondern das, was fehlt. Das Glaskugellesen überlasse ich anderen.



  • aber ist das von der Syntax richtig so zu schreiben:

    Fsm importFsm( new ImportUnprocessedState());

    bei dem Konstruktor Fsm(State * state), wo ImportUnprocessedState : State?



  • das Program ist nur dann fehlerhaft wenn diese Zeile da steht.



  • Syntax ist gut. Hast du vielleicht vergessen, den Header einzubinden?

    und denk bitte daran, den Speicher wieder freizugeben. Evtl. wäre ein shared pointer das Mittel deiner Wahl...



  • koschka schrieb:

    aber ist das von der Syntax richtig so zu schreiben:

    Nein, ist es nicht. C++ ist nicht Java.



  • Wo ist denn deiner Meinung nach ein Syntax-Fehler?



  • 314159265358979 schrieb:

    koschka schrieb:

    aber ist das von der Syntax richtig so zu schreiben:

    Nein, ist es nicht. C++ ist nicht Java.

    von der Syntax ist das korrekt, es wird so kompilieren. Ob es guter Stil ist, steht auf einem ganz anderen Blatt.



  • was wäre guter Still? Wie mache ich das richtig?



  • Grundsätzlich, verwende sowenig new wie möglich. Automatisierte Speicherverwaltung gibt's auch ohne Garbagecollector (smart pointer und STL) wenn du mal new verwendest achte auf RAII, oder schau wenigstens das du den pointer behälst und danach wieder mit delete freigibst, sonst gibts ein memory leak. Das sollte prinzipiell in in sich abgeschlossenen Einheiten stattfinden, damits übersichtlich bleibt (also new/delete in EINER Funktion, die genau das freigibt was sie angefordert hat, oder in EINEM Objekt, das im D-tor genau das freigibt, was im c-tor angefordert wurde). Letzteres wirst du mit

    Fsm importFsm(new ImportUnprocessedState());
    

    auf jedenfall verletzen.

    Soweit ich im ersten Beitrag lese, verwendest du viel zuviel new:

    ImportUnprocessedState importState = new ImportUnprocessedState();
    Fsm importFsm = new Fsm(&importState);
    

    Der Hinweis das new einen Zeiger zurückgibt, hat dich wohl das machen lassen:

    ImportUnprocessedState* importState = new ImportUnprocessedState();
    Fsm* importFsm = new Fsm(&importState);
    

    Viel besser wäre aber wahrscheinlich das gewesen:

    ImportUnprocessedState importState();
    Fsm importFsm(importState);
    

    Selbst falls du tatsächlich Zeiger brauchst, wäre das wohl immer noch besser (smart pointer verwenden), weil es sich auch um die Speicherverwaltung kümmert:

    unique_ptr<ImportUnprocessedState> importState(new ImportUnprocessedState());
    uniquite_ptr<Fsm> importFsm(new Fsm(importState));
    

    Woher deine Linker-Fehler kommen kann man ohne Glaskugel wohl nicht sagen - hilfreich wäre wohl, wenn du erstmal die Fehler hier reinschreibst, und eventuell relevanten code.



  • Sup schrieb:

    ImportUnprocessedState importState();
    

    Das ist eine Funktionsdeklaration. Mach die Klammern weg.

    Sup schrieb:

    uniquite_ptr<Fsm> importFsm(new Fsm(importState));
    

    Sollte auch unique_ptr heißen.



  • Ja hast recht.


Log in to reply