Вам не хватает ключевого слова "static".
// .h
class Playfield
{
public:
static char GetTile( int x, int y );
// static on a method means no 'this' is involved
};
// .cpp
static char tiles[10][10] = {};
// static on vars in .cpp prevents access from outside this .cpp
char Playfield::GetTile( int x, int y )
{
// handle invalid args
// return tile
return tiles[x][y];
}
Есть и другие варианты, если вам нужно только одно уникальное игровое поле:
Вы можете сделать Playfield одиночным, превратить его в пространство имен или использовать глобальные функции.
Результат тот же с точки зрения звонящего.
На примечании стороны:
Поскольку все они используют статическую и / или глобальную переменную, она по своей природе не является поточно-ориентированной.
Если вам требуется несколько игровых полей и / или вы хотите играть безопасно с многопоточностью и / или хотите сделать это абсолютно ООП, вам понадобится экземпляр Playfield для вызова функции (указатель this ):
class Playfield
{
public:
char GetTile( int x, int y ) const { return this->tiles[x][y]; }
// you can omit 'this->', but it's inherently present because
// the method is not marked as static
public:
Playfield()
{ /*you will have to initialize 'this->tiles' here because
you cannot use the struct initializer '= {}' on member vars*/ }
private:
char tiles[10][10];
};
Код вызова будет использовать Playfield следующим образом:
void main()
{
// static version
char tile11 = Playfield::GetTile( 1, 1 );
// non-static version
Playfield myPlayfield;
char tile12 = myPlayfield.GetTile( 1, 2 );
}