Я хочу передать как ссылку на другой класс, и инициализировать член, это возможно? - PullRequest
2 голосов
/ 13 января 2012

У меня такая ситуация:

class GEngine {
private:
    ChessBoard board;
    ChessMoves checkBoard(board);
...

и ChessMoves c'tor определяется следующим образом:

class ChessMoves {
private:
    ChessBoard nullChessBoard;
    ChessBoard const& refBoard;
    Flags cBoard[8][8]; //checkboard
public:
    ChessMoves():refBoard(nullChessBoard){resetcBoard();}
    ChessMoves(ChessBoard const& ref):refBoard(ref){resetcBoard();};

но возвращает эту ошибку:

GameEngine.cpp:250: error: ‘((GEngine*)this)->GEngine::checkBoard’ does not have class type
GameEngine.cpp:251: error: ‘((GEngine*)this)->GEngine::checkBoard’ does not have class type
GameEngine.cpp:251: error: ‘((GEngine*)this)->GEngine::checkBoard’ does not have class type

когда я запускаю этот код:

    //check if piece can move there
    checkBoard.fillcBoard(from); //checkBoard called here...
    if(checkBoard.get(to) == canPASS or checkBoard.get(to) == canEAT){
            /*empty*/
    }
    else{
            return isValid = false;
    }
    return isValid = true;

Я хочу передать как ссылку на другой класс, и initialize является членом:

что-то вроде

class X{
private:
    ref const& _Mreference;
public:
    X( ref const& ref):_Mreference(ref){}
};

возможно ли это?

Ответы [ 2 ]

3 голосов
/ 13 января 2012

Когда вы делаете это

ChessMoves checkBoard(board);

вы объявляете функцию в области видимости класса GEngine. Это также недопустимое объявление (потому что board не тип - ищите другие сообщения об ошибках от вашего компилятора). Когда вы делаете

checkBoard.fillcBoard(from);

ваш компилятор думает, что вам нужно получить доступ к функции-члену объявленной функции, что недопустимо, потому что GEngine::checkBoard не тип класса (а тип функции, и это то, что говорит компилятор).

То, что вы хотите сделать, это:

class GEngine {
private:
    ChessBoard board;
    ChessMoves checkBoard;
...

// In the implementation file
GEngine::GEngine() : board(), checkBoard(board) {}

И это должно быть хорошо. Просто убедитесь, что вы (в данном случае) никогда не меняете порядок объявления в классе, так как члены класса инициализируются в порядке их объявления (но если вы перепутаете это, ваш компилятор должен предупредить вас об этом - обязательно отнеситесь к этому предупреждению серьезно).

1 голос
/ 13 января 2012

Ваша декларация о шахматной доске недействительна.Вы не можете инициализировать объект в классе таким образом (по крайней мере, не в C ++ 03, и ни один из известных мне компиляторов не поддерживает функцию C ++ 11).Вам нужно сделать это в конструкторе, например:

class GEngine {        
private:
    ChessBoard board;
    ChessMoves checkBoard;
public:
    GEngine()
        :checkBoard(board)
    {}
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...