Участник не указан в сфере охвата?

Итак, я пробую свои силы в C ++ после того, как закончил вводную книгу, и я застрял. Я создал вектор объектов, каждый из которых имеет объект круга SFML в качестве члена, и я хочу, чтобы main () пошел и нарисовал эти круги. Вектор называется theBoard, но когда я пытаюсь получить к нему доступ, я получаю следующие сообщения об ошибках:

error: request for member 'theBoard' in 'GameBoard', which is of non-class type 'Board*'
error: 'theBoard' was not declared in this scope

Я новичок в этом (пришел после двух лет обучения Python), поэтому я уверен, что где-то ошибся. Вот соответствующий код для создания доски:

class Board
{
public:
    //These are the member functions.
    Board();
    ~Board();
    vector<Space*> CreateBoard();
    //This will be the game board.
    vector<Space*> theBoard;
    //These clusters represent the waiting areas for pieces not yet in the game.
    vector<Space*> Cluster1;
    vector<Space*> Cluster2;
    vector<Space*> Cluster3;
private:
    //These integers represent the number of spaces on each row, starting at the top     (which is row [0])
    vector<int> RowNums;
};

Board::Board()
{
    //Fill in RowNums with the right values.
    RowNums.push_back(1);
    RowNums.push_back(17);
    RowNums.push_back(2);
    RowNums.push_back(17);
    RowNums.push_back(1);
    RowNums.push_back(1);
    RowNums.push_back(5);
    RowNums.push_back(2);
    RowNums.push_back(7);
    RowNums.push_back(2);
    RowNums.push_back(11);
    RowNums.push_back(3);
    RowNums.push_back(17);
    RowNums.push_back(4);
    RowNums.push_back(17);
    //Then, create the board.
    theBoard = CreateBoard();
}

CreateBoard () - это очень и очень длинная функция, которая возвращает вектор указателей на объекты Space. Я сомневаюсь, что здесь есть проблема, поскольку единственное сообщение об ошибке, которое я получаю, появляется, когда я пытаюсь получить доступ к членам круга объектов Space в main (). Мне кажется, что я объявил theBoard в соответствующей области видимости, то есть как член данных класса Board.

Моя функция main (), если она важна:

int main()
{
    //This sets up the display window.
    sf::RenderWindow App(sf::VideoMode(1200, 900, 32), "Malefiz");

    //This creates the board on the heap, and a pointer to it.
    Board* GameBoard = new Board();

    cout << "Board made.";

    //This is the game loop.
    while(App.IsOpened())
    {
        //This is used to poll events.
        sf::Event Event;
        while(App.GetEvent(Event))
        {
            //This closes the window.
            if(Event.Type == sf::Event::Closed)
            {
                App.Close();
            }
        }

        //This gets the time since the last frame.
        //float ElapsedTime = App.GetFrameTime();

        //This fills the window with black.
        App.Clear(sf::Color(200, 200, 125));
        //This draws the places into the window.
        for(int i = 0; i < GameBoard.theBoard.size(); ++i)
        {
            App.Draw(GameBoard.*theBoard[i].m_Circle);
        }
        //This displays the window.
        App.Display();
    }

    return EXIT_SUCCESS;
}

person GarrickW    schedule 13.06.2011    source источник


Ответы (4)


Ошибка довольно очевидна, если вы внимательно ее прочитаете:

error: request for member 'theBoard' in 'GameBoard', which is of non-class type 'Board*'
error: 'theBoard' was not declared in this scope

Первая строка сообщает вам, что у вас есть указатель на объект Board и вы пытаетесь получить доступ к члену напрямую. Это:

Board *p = ...
p.theBoard;     // Error, should be p->theBoard, as p is a pointer

Также обратите внимание, что GameBoard.*theBoard[i].m_Circle может быть не тем, что вам нужно, вы, вероятно, захотите (я предполагаю, поскольку отсутствуют важные биты) что-то вроде GameBoard->theBoard[i]->m_Circle.

person David Rodríguez - dribeas    schedule 13.06.2011

В вашей main() функции GameBoard - это Board *, а не Board. Итак, чтобы получить доступ к участникам, вам нужно использовать -> вместо .. например.:

GameBoard->theBoard.size()

[Некоторые люди (я один из них) любят называть свои переменные-указатели с помощью префикса p или ptr, чтобы явно прояснить этот вид раздражения.]

person Oliver Charlesworth    schedule 13.06.2011
comment
о, прекрасные системы венгерской нотации ... (ненавижу!) :) Я понимаю префикс p, но дальше, пожалуйста: не надо. - person David Rodríguez - dribeas; 13.06.2011
comment
@David: Да, это предел моего использования венгерского языка. Я думаю, что p важен, потому что указатели оказывают такое сильное влияние на необходимый базовый синтаксис. Я согласен, что вся lpsz ерунда Microsoft безумна! - person Oliver Charlesworth; 13.06.2011

GameBoard - это указатель на объект Board, поэтому вам нужно использовать оператор «->» вместо «.» для доступа к любой из его переменных или методов-членов.

person devyndraen    schedule 13.06.2011

GameBoard - указатель, поэтому синтаксис должен быть таким:

 for(int i = 0; i < GameBoard->theBoard.size(); ++i)
 {
        App.Draw((GameBoard->theBoard[i])->m_Circle);
 }

Поскольку элементы theBoard также являются указателями, я использовал обозначение указателя при доступе к m_Circle.

person Nawaz    schedule 13.06.2011