【问题标题】:Invalid use of non-static Data Member c++非静态数据成员c ++的无效使用
【发布时间】:2023-03-12 00:51:01
【问题描述】:

我已经查看了与此标题相同的问题的各种答案,但无济于事,所以不幸的是我不得不发布自己的版本。我会尽可能全面地解释。我得到的错误如下

error: invalid use of non-static data member 'MainState::pellet'

此错误与 Player 类文件中的一个函数有关,该函数试图访问在另一个文件中声明的 5 个 Pellet 类对象数组的成员。这是导致错误的函数:

    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++ 还是很陌生,所以我知道我做错了什么或者没有在这里实现一些东西,但是尽管阅读了一个小时左右的类似问题,但还是看不到什么,抱歉。希望有人能对此有所了解,谢谢!

【问题讨论】:

  • 如果您希望颗粒数组是静态的以匹配您访问它的方式(每个类而不是每个对象),您需要将 static 关键字放在它前面。然后,您将需要在 cpp 文件中定义一些代码,并将代码放在类定义之外。如果您制作对象数组而不是指针,也不需要新的颗粒。查找初始化静态成员的语法。

标签: c++ arrays function class


【解决方案1】:

正如错误所说,pelletMainState 的非静态成员;因此您只能将其作为MainState 对象的一部分进行访问。您正在尝试将其作为静态成员进行访问,该成员独立于任何对象而存在。

如果您的Player 类需要访问它,那么它将需要对它的引用,或者对包含它的MainState 对象的引用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-01-12
    • 2013-10-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-22
    • 1970-01-01
    • 2017-09-12
    相关资源
    最近更新 更多