Question

So I'm trying my hand at some C++ after finishing up an introductory book, and I've become stuck. I've made a vector of objects that each have an SFML circle object as a member, and I want main() to go and draw these circles. The vector is called theBoard, but when I try to access it, I get the following error messages:

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

I'm new to this (came from two years of Python), so I'm sure I made a mistake somewhere. Here is the relevant code for the board creation:

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() is a very, very long function that returns a vector of pointers to Space objects. I doubt there's a problem here, as the only error message I get crops up when I try to access the circle members of Space objects in main(). It seems to me as though I have declared theBoard in the relevant scope, that is, as a data member of the Board class.

My main() function, in case it's important:

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;
}
Was it helpful?

Solution

The error is quite explicit if you read it carefully:

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

The first line is telling you that you have a pointer to a Board object and you are trying to access a member directly. That is:

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

Also note that GameBoard.*theBoard[i].m_Circle might not be what you want, you probably want (I am guessing as there are important bits missing) something like GameBoard->theBoard[i]->m_Circle.

OTHER TIPS

In your main() function, GameBoard is a Board *, not a Board. So to access members, you need to use -> instead of .. e.g.:

GameBoard->theBoard.size()

[Some people (I am one of them) like to name their pointer variables with a leading p or ptr prefix, in order to make this kind of irritation explicitly clear.]

GameBoard is a pointer to a Board object, and thus you need to use the "->" operator instead of the "." operator to access any of its member variables or methods.

GameBoard is a pointer, so the syntax should be this:

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

Since elements of theBoard also are pointer, so I used the pointer notation when accessing m_Circle.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top