2014-03-05 50 views
0

我已經看過各種各樣的問題的答案,以相同的標題開始,但無濟於事,所以不得不發佈我自己的版本。我會盡可能全面地解釋。我發現了錯誤如下非靜態數據成員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++都很陌生,所以我知道我做了一些錯誤的事情,或者沒有在這裏實現某些東西,但儘管在一個小時左右閱讀了類似的問題仍然看不到,對不起。希望有人能對此發光,謝謝!

+0

如果您希望pellet數組是靜態的以符合您訪問它的方式(每個類不是每個對象),您需要將static關鍵字放在它的前面。然後,您需要在cpp文件中定義一些代碼並將其初始放置在類定義之外。如果您創建對象數組而不是指針,那麼也不需要新建粒料。查找用於初始化靜態成員的語法。 – Apriori

回答

2

正如錯誤所述,pelletMainState的非靜態成員;所以你只能作爲MainState對象的一部分訪問它。您試圖訪問它,就好像它是一個靜態成員,它獨立於任何對象存在。

如果您的Player類需要訪問它,那麼它將需要對它的引用或包含它的MainState對象。

+0

謝謝,我只需要看清楚:) – WearyWanderer

相關問題