c++中静态数据成员的类内初始化
C++ in-class initialization of static data member
我正试图为这两个变量(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 );
相关文章:
- 是否可以使用右值初始化数据成员?
- 扩展初始值设定项列表和未初始化的成员
- 初始化类成员的更好做法是什么?
- 使用 {} 初始化类成员
- 构造函数正在初始化数据成员
- 在类声明中初始化 const 成员变量时在调试模式下出现异常
- 初始化 const 成员的正确方法
- 初始化数据成员取决于构造函数中的条件
- 获取未初始化对象成员的地址是否定义良好?
- 为什么C++可以使用未初始化的成员变量(引用或指针 *NOT 值复制*)来初始化其父类的成员变量
- C - 初始化静态成员的方法
- 使用大型数据集初始化类成员向量的最有效方法
- 如何在C 11中正确初始化数据成员
- 在C++中,如果我们不在构造函数中初始化数据成员,那么类中数据成员的值会是多少
- 为什么我们需要构造函数 C++,我们可以通过函数(初始化数据或访问私有数据成员)来做同样的事情
- 正在初始化数据文件中的静态常量成员
- 用成员函数初始化数据成员
- 如何用该类的其他成员数据初始化类成员数据
- 尝试在构造函数中初始化数据成员,但失败.为什么
- 在c++中使用初始化列表初始化数据成员引用