c++中静态数据成员的类内初始化

C++ in-class initialization of static data member

本文关键字:初始化 数据成员 静态 c++      更新时间:2023-10-16

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

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

我做错了什么,我该如何解决这个问题?

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

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

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

另外,给一个静态成员名与其类名匹配也是一个坏主意。

删除静态成员的初始化,并将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 );