Not a Type



  • hallo ich habe folgenden Code, bei dem diese fehlermeldungen kommen:

    ||=== TicTacToe, Debug ===|
    D:\Eigene Dateien\Development Location\Projekte\TicTacToe\Field.hpp|18|error: 'Player' has not been declared|
    D:\Eigene Dateien\Development Location\Projekte\TicTacToe\TicTacToe.hpp|12|error: 'Player' does not name a type|
    D:\Eigene Dateien\Development Location\Projekte\TicTacToe\TicTacToe.hpp|13|error: 'Player' does not name a type|
    D:\Eigene Dateien\Development Location\Projekte\TicTacToe\TicTacToe.hpp|14|error: 'Player' does not name a type|
    D:\Eigene Dateien\Development Location\Projekte\TicTacToe\TicTacToe.hpp|16|error: expected ')' before '&' token|
    D:\Eigene Dateien\Development Location\Projekte\TicTacToe\TicTacToe.hpp|19|error: 'Player' has not been declared|
    D:\Eigene Dateien\Development Location\Projekte\TicTacToe\Player.hpp|17|error: initializer specified for non-virtual method 'void Player::Turn(TicTacToe&)'|
    ||=== Build finished: 7 errors, 0 warnings ===|

    Bei diesen stellen:

    // Field.hpp
    #ifndef FIELD_HPP
    #define FIELD_HPP
    
    #include "Player.hpp"
    #include "Symbol.hpp"
    
    class Field
    {
        private:
            bool visible;
            int rows,columns;
            Symbol* table;
        public:
            Field(int r, int c);
            void Init();
    
            void SetCell(Player& p, int r, int c);
            Symbol GetCell(int r, int c) const;
    
            int GetRows() const;
            int GetColumns() const;
    
            int GetEmptyCells() const;
    
            void Show();
            void SetVisibility(bool status);
            bool IsVisible() const;
    };
    
    #endif // FIELD_HPP
    
    // TicTacToe.hpp
    #ifndef TICTACTOE_HPP
    #define TICTACTOE_HPP
    
    #include "Player.hpp"
    #include "Field.hpp"
    
    class TicTacToe
    {
        private:
            Field* f;
            Player* p1;
            Player* p2;
            Player* pc; // Current Player
        public:
            TicTacToe(Player& a, Player& b, Field& c);
            bool Turn(int r, int c);
            bool IsEnd();
            bool CheckSeries(Player& p);
            bool Run();
    };
    
    #endif // TICTACTOE_HPP
    

    Warum? für mich sieht alles ganz ok aus.

    Mfg Alf! 🙂



  • Ich würde mal sagen, dass Player.hpp Field.hpp oder TicTacToe.hpp inkludiert, was dann einen zyklischen include gibt und einen solchen Fehler erzeugt.
    Siehe dazu hier:
    http://www.drakon.ch/?id=&offset=5&mobile=0&show_entry=77



  • 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.


Log in to reply