我已經看過各種各樣的問題的答案,以相同的標題開始,但無濟於事,所以不得不發佈我自己的版本。我會盡可能全面地解釋。我發現了錯誤如下非靜態數據成員C++的使用無效
error: invalid use of non-static data member 'MainState::pellet'
此錯誤涉及在播放機的類文件的函數,其試圖訪問在另一個文件中聲明5個顆粒類對象的陣列的成員。下面是這是造成錯誤的函數:
void Player::onCollide(std::list<Entity*>& entityList)
{
//create two iterators so can do self-checks
std::list<SnakePieces>::iterator i;
std::list<SnakePieces>::iterator m;
//collision with pellet
for(Entity* player : entityList)
{
Player* p = dynamic_cast<Player*>(player);
if(p)
{
i=p->Snake_List.begin();
for(int t=0; t < 4; t++)
{
if(i->x==MainState::pellet[t]->x)
{
return;
}
}
}
}
//all collisions for the first snake
auto itPlayer = entityList.begin();
Player* p = dynamic_cast<Player*>(*(itPlayer++));
Player* p2 = dynamic_cast<Player*>(*itPlayer);
if(p)
{
if(i != m)
{
i=p->Snake_List.begin();
for(m=p2->Snake_List.begin(); m != p2->Snake_List.end(); m++)
{
if ((i->x == m->x) && i->y == m->y)
{
p->respawn();
return;
}
}
}
}
數組在MainState類的頭文件聲明,看起來像這樣:
class MainState : public prg::IAppState,
public prg::ITimerEvent
{
public:
void onRender(prg::Canvas& canvas) override;
void onTimer(prg::Timer & Timer) override;
void checkBoundaries();
Pellet* pellet[5] {new Pellet(), new Pellet(), new Pellet(), new Pellet(), new Pellet()};
private:
//timers
prg::Timer Timer {0, 150, *this};
prg::Timer Spawn_Timer {1, 5000, *this};
//players & pellets
std::list<Entity*> players_ { new HumanPlayer("Solid Snake"), new HumanPlayer ("Liquid Ocelot")};
//images
prg::Image background_;
//bools
bool newPlayer = false;
bool timerRunning = false;
};
我剪出來的代碼無關很大對於這個問題,但我無法理解問題的原因以及爲什麼我無法訪問這些數據。我對很多C++都很陌生,所以我知道我做了一些錯誤的事情,或者沒有在這裏實現某些東西,但儘管在一個小時左右閱讀了類似的問題仍然看不到,對不起。希望有人能對此發光,謝謝!
如果您希望pellet數組是靜態的以符合您訪問它的方式(每個類不是每個對象),您需要將static關鍵字放在它的前面。然後,您需要在cpp文件中定義一些代碼並將其初始放置在類定義之外。如果您創建對象數組而不是指針,那麼也不需要新建粒料。查找用於初始化靜態成員的語法。 – Apriori