Not a Type



  • Jetzt funktioniert das super, doch nun kommt auch gleich das nächste problem 😃
    Ich bekomme bei diesem konstruktor

    Player::Player(char s)
    {
        this->points = 0;
        this->symbol(s);
    }
    

    folgendes

    D:\Eigene Dateien\Development Location\Projekte\TicTacToe\Player.cpp||In constructor 'Player::Player(char)':|
    D:\Eigene Dateien\Development Location\Projekte\TicTacToe\Player.cpp|4|error: no matching function for call to 'Symbol::Symbol()'|
    D:\Eigene Dateien\Development Location\Projekte\TicTacToe\Symbol.hpp|10|note: candidates are: Symbol::Symbol(char)|
    D:\Eigene Dateien\Development Location\Projekte\TicTacToe\Symbol.hpp|6|note: Symbol::Symbol(const Symbol&)|
    D:\Eigene Dateien\Development Location\Projekte\TicTacToe\Player.cpp|7|error: no match for call to '(Symbol) (char&)'|
    ||=== Build finished: 4 errors, 0 warnings ===|



  • Probier

    Player::Player(char s):
    symbol(s),
    points(0)
    {}
    


  • Alf321 schrieb:

    Jetzt funktioniert das super, doch nun kommt auch gleich das nächste problem 😃
    Ich bekomme bei diesem konstruktor

    Player::Player(char s)
    {
        this->points = 0;
        this->symbol(s);
    }
    

    folgendes

    D:\Eigene Dateien\Development Location\Projekte\TicTacToe\Player.cpp||In constructor 'Player::Player(char)':|
    D:\Eigene Dateien\Development Location\Projekte\TicTacToe\Player.cpp|4|error: no matching function for call to 'Symbol::Symbol()'|
    D:\Eigene Dateien\Development Location\Projekte\TicTacToe\Symbol.hpp|10|note: candidates are: Symbol::Symbol(char)|
    D:\Eigene Dateien\Development Location\Projekte\TicTacToe\Symbol.hpp|6|note: Symbol::Symbol(const Symbol&)|
    D:\Eigene Dateien\Development Location\Projekte\TicTacToe\Player.cpp|7|error: no match for call to '(Symbol) (char&)'|
    ||=== Build finished: 4 errors, 0 warnings ===|

    Mach es lieber so:

    Player::Player(char s)
        :points(0), symbol(s)
    {}
    

    mfg D3lta

    P.S.: Du kannst keinen Konstruktor per Hand aufrufen 😉



  • Danke, so funktionierts 😃



  • D3lta schrieb:

    P.S.: Du kannst keinen Konstruktor per Hand aufrufen 😉

    Wie meinst du das? Natürlich kann man das.

    P.S.: Du hast genau dasselbe wie ich geschrieben.



  • Hacker schrieb:

    P.S.: Du hast genau dasselbe wie ich geschrieben.

    Schade, wie oberflächlich manche Programmierer sind. Sie wissen nicht, dass es nur eine legale Reihenfolge der Initialisierungsliste gibt. Noch schlimmer: Sie erkennen die Reihenfolge nicht einmal mehr.



  • [quote="unexaktor"]

    Hacker schrieb:

    Sie wissen nicht, dass es nur eine legale Reihenfolge der Initialisierungsliste gibt.

    Wusste garnicht, dass das einen Unterschied macht.
    Belehr mich.



  • C++ Standard (12.6.2.5) schrieb:

    Initialization shall proceed in the following order: [...] nonstatic data members shall be initialized in the order they were declared in the class definition (again regardless of the order of the mem-initializers) [...]

    Leute wie Scott Meyers leiten daraus die Regel ab, dass die Reihenfolge der Initialisierungsliste der Reihenfolge der Deklaration entsprechen soll. Gute Compiler halten sich daran.



  • Hacker schrieb:

    Wusste garnicht, dass das einen Unterschied macht.

    Blöderweise geben einige Compiler wie der MSVC keine Warnung aus, wenn man dagegen verstößt.

    Wenn man also nur diese Compiler verwendet, ist es natürlich klar, dass diese Regel in Vergessenheit gerät - ich habe mich lange Zeit nicht daran gehalten, bis mich ein Kollege darauf aufmerksam gemacht hat 🙄 .



  • Hacker schrieb:

    Wusste garnicht, dass das einen Unterschied macht.

    Es macht keinen Unterschied, das ist der Witz an der Sache - in beiden Versionen werden die Variablen in der Reihenfolge initialisiert, in der sie in der Klassendefinition stehen, unabhängig von der Reihenfolge in der Initialisierungsliste.


Anmelden zum Antworten