初始化类的静态数据成员

时间:2019-07-13 08:48:25

标签: c++ static

我正在尝试学习C ++,并且遇到了一个我无法全神贯注的概念。我在头文件中定义了带有静态数据成员的类,并尝试在单独的CPP文件中对其进行初始化。为了使它起作用,我必须再次指定相同数据成员的类型,这看起来确实很奇怪,就像用相同的名称和类型定义变量一样。我想知道为什么我必须再次指定变量的类型。

我包含了代码(我也在使用SFML框架):

头文件:

#pragma once
#ifndef TEXTURE_HOLDER_H
#define TEXTURE_HOLDER_H
#include <SFML/Graphics.hpp>
#include <map>
using namespace sf;
using namespace std;
class TextureHolder
{
private:
    // A map container from the STL,
    // that holds related pairs of String and Texture
    map<string, Texture> m_Textures;
    // A pointer of the same type as the class itself
    // the one and only instance
    static TextureHolder* m_s_Instance;
public:
    TextureHolder();
    static Texture& GetTexture(string const& filename);
};
#endif // !TEXTURE_HOLDER_H

CPP文件:

#include "TextureHolder.h"

// Include the "assert feature"
#include <assert.h>

TextureHolder* TextureHolder::m_s_Instance = nullptr;
.
.
.

非常感谢您的光临!

1 个答案:

答案 0 :(得分:0)

简短答案

您必须指定第二种类型,因为这是C ++的设计方式。 没有任何语法糖,AFIAK。

部分解决方法是为类型(typedef / using)创建一个较短的名称。

长答案

类定义中的静态变量是声明。这是有原因的-如果编译器将在包含标头的每个编译单元中创建变量,则链接器将无法确定要使用哪个变量。这就是为什么您只需要在一个编译单元中手动定义变量的原因。在这方面,C ++是相当底层的语言。 (也许模块的传入功能会改变这一点,但是我对它们了解不多,所以只是一个猜测。)

问题在于C ++中的声明是定义的第二个概念。声明只是告诉编译器声明存在于某个地方,即使它是一个不同的文件也是如此。在声明似乎比定义更重要的方面,类是非常独特的。从语言结构的角度来看,如果必须在声明变量时告诉类型而不是在定义变量时告诉类型,那将是相当落后的。我个人认为仍然可能存在一些语法糖,例如使用关键字auto而不是完整类型的选项,但是现在我们必须享受我们拥有的东西。