C++ in-class静态数据成员的初始化

C++ in-class initialization of static data member

我正在尝试为这两个变量(window、windowSurface)创建一个 class,以便我可以在代码的不同区域访问它们。我的错误是:

include/windowSurface.h|11|error: field initializer is not constant|
include/windowSurface.h|11|error: in-class initialization of static data member ‘SDL_Window windowSurface::window’ of incomplete type

来自下面的代码

#ifndef WINDOWSURFACE_H
#define WINDOWSURFACE_H
#include "SDL2/SDL.h"

class windowSurface
{
    public:
        windowSurface();
        virtual ~windowSurface();
        static SDL_Window window = SDL_CreateWindow( "Tetris", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, 640, 480, SDL_WINDOW_SHOWN );
        static SDL_Surface windowSurface = SDL_GetWindowSurface( window );
    protected:
    private:
};

#endif // WINDOWSURFACE_H

我做错了什么,我该如何解决?

仔细阅读编译器给你的错误。

可以声明静态数据成员,但不能在 class 定义中定义,除非此静态数据成员为整型或枚举类型并且声明为 const(而非 volatile)。

由于 C++11 静态数据成员 LiteralType 和声明为 constexpr 可以用大括号或等号初始化器初始化,它是 class 定义中的常量表达式。

此外,提供与其 class 名称匹配的静态成员名称也是个坏主意。

删除静态成员的初始化并将 windowSurface 重命名为 surface:

class windowSurface
{
public:
    windowSurface();
    virtual ~windowSurface();
    static SDL_Window window;
    static SDL_Surface surface;
protected:
private:
};

并在对应的cpp文件中添加定义:

SDL_Window windowSurface::window = SDL_CreateWindow( "Tetris", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, 640, 480, SDL_WINDOW_SHOWN );
SDL_Surface windowSurface::surface = SDL_GetWindowSurface( windowSurface::window );