如何在C++中引用类的非静态成员[已关闭]

z18hc3ub  于 2023-03-14  发布在  其他
关注(0)|答案(3)|浏览(152)

**已关闭。**此问题为not reproducible or was caused by typos。当前不接受答案。

这个问题是由打字错误或无法再重现的问题引起的。虽然类似的问题在这里可能是on-topic,但这个问题的解决方式不太可能帮助未来的读者。
3天前关闭。
Improve this question
我正在写一个头文件,我试图改变主类中的一个变量,但是弹出了一个错误:
“非静态成员必须相对于特定对象”
我并不想创建一个对象,并且变量必须是非静态的,我找到的解决方案包括创建一个对象,或者将其设置为constexpr静态,虽然这样做有效,但它将使其不可修改
发动机h:

class Engine {
public:
    playerObject2D mainPlayer;
    /* other definitions */
};

main.cpp:

#include "Engine.h"
playerObject2D player;

int main(int argc, char* argv[]){
    Engine::init(640, 480, "Test", 0, 0, 0, argc, argv);
    player.setPos(320,240); /* set player positon to center of screen */
    player.pspd = 8; /* set player speed */
    
    Engine::mainPlayer = player; /* Error */
}
vof42yt1

vof42yt11#

必须使用其中一种方法来创建类的示例。

class Engine
{
public:
    void DoStuff() {}
};

您可以直接在堆栈上执行此操作

int main(int argc, char* argv[])
{
    Engine engine;
    engine.DoStuff();
}

或者您可以在堆上创建它并通过指针访问它。

int main(int argc, char* argv[])
{
    Engine* engine = new Engine();
    engine->DoStuff();
}
yduiuuwa

yduiuuwa2#

Engine::init并不初始化全局对象Engine,它只是类Engine命名空间中的一个静态(非成员)函数,如果你打算写一个单例,那么你必须通过一个静态函数访问该单例的成员:

// within class Engine
static Engine& instance()
{
    static Engine inst;
    return inst;
}

// within main
Engine::instance().mainPlayer = player;

否则,编写一个常规的C++构造函数,并创建类Engine的单个示例,如另一条注解所述:https://stackoverflow.com/a/75683067/16062280

2guxujil

2guxujil3#

mainPlayer不需要是constexpr,这是程序员根据自己的需求做出的选择。
但是成员变量要么是示例成员,要么是类成员(例如static),你不能两者兼得。

相关问题