C ++类静态数据成员的初始化

时间:2015-08-12 01:02:49

标签: c++ compiler-errors static-variables

我正在尝试为这两个变量(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

我做错了什么以及如何解决这个问题?

1 个答案:

答案 0 :(得分:2)

仔细阅读编译器提供的错误。

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

由于LiteralType的C ++ 11静态数据成员并声明为constexpr,因此可以使用在类定义中作为常量表达式的大括号或大小的初始化程序进行初始化。

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

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