这个静态方法发生了什么?

What happened with this static method?

我在名为 Renderer 的 class 中有一个名为 getSingleton() 的静态方法,我将其用作宏,如下所示:

Renderer.h

#define g_Renderer Renderer::getSingleton()

class Renderer {
private:
    Renderer();
    static Renderer renderer;

public:
    Renderer getSingleton();
};

Renderer.cpp

#include "Renderer.h"
Renderer::Renderer() {}

Renderer Renderer::getSingleton() {
#ifndef CREATED_RENDERER
#define CREATED_RENDERER;
    renderer = Renderer();
#endif // !CREATED_RENDERER

    return renderer;
}

我访问main中的方法:

Main.cpp

#include "Renderer.h"
int main(){
    
    return 0;
}

但是 Visual Studio 给我这个错误:

Main.obj : error LNK2019: unresolved external symbol "public: static class Renderer __cdecl Renderer::getSingleton(void)" (?getSingleton@Renderer@@SA?AV1@XZ) referenced in function main

这是为什么?提前致谢!

您的 getRenderer() 方法设置完全错误,无法满足您的要求。

一方面,它不是 static

另一方面,static 变量仅在任何地方被 声明 ,而不是 定义 ,这就是为什么链接器是抱怨。您需要将此行添加到 Renderer.cpp 以实际实例化变量:

Renderer Renderer::renderer;

此外,getRenderer() 每次调用都会返回一个新的 Renderer 对象,这对单例来说是无用的。 #ifdef 在运行时也没有用。

尝试更像这样的东西:

Renderer.h

#ifndef Renderer_H
#define Renderer_H

#define g_Renderer Renderer::getSingleton()

class Renderer {
private:
    Renderer();
public:
    static Renderer& getSingleton();
};

#endif

Renderer.cpp

#include "Renderer.h"

Renderer::Renderer() {}

Renderer& Renderer::getSingleton() {
    static Renderer instance;
    return instance;
}

Main.cpp

#include "Renderer.h"

int main(){
    // use g_Renderer as needed...
    return 0;
}