对于在其类声明之外的静态成员初始化,是不是有必要提供其类型?

Posted

技术标签:

【中文标题】对于在其类声明之外的静态成员初始化,是不是有必要提供其类型?【英文标题】:for a static member initialization outside its class declaration, is it necessary to provide its type?对于在其类声明之外的静态成员初始化,是否有必要提供其类型? 【发布时间】:2020-09-02 05:10:36 【问题描述】:

我有一门课

游戏.h:

class Game 

public:

    ~Game ()

    bool init(const char* title,int xpos, int ypos, int width, int height,bool fullscreen );


    void render();
    void update() ;
    void handleEvents();
    void clean();
    void draw();
    static Game* Instance();
    // a function to acces the private running variable 
    bool running () return m_bRunning; 

private:
    Game ();
    static Game* s_pInstance;
    SDL_Window* m_pWindow;
    SDL_Renderer* m_pRenderer;
    bool m_bRunning;
    int m_currentFrame;

;

//create the typedef
typedef Game TheGame; 

在 Game.cpp 中,我有一个静态变量初始化,如下所示

Game* Game::s_pInstance = 0; 

所以我想知道为什么我需要在这里使用 (Game*) 变量类型,这是必须的吗?

【问题讨论】:

是的。也不需要 typedef - 它没有任何作用。 无关:您可能会发现Meyers Singleton 更方便(并且从 C++ 11 开始更安全) 【参考方案1】:

我有一个静态变量初始化,如下所示

Game* Game::s_pInstance = 0;

此描述不完整。更准确地说:您有一个静态变量定义,并且初始化是该定义的一部分。初始化不需要提及类型,但定义需要。从语法上讲,您可以省略初始化部分(删除= 0),但您仍然需要定义才能使用该变量。 警告:不要真正放弃初始化,除非作为实验来查看它是否可以编译。

定义需要包含被定义事物的类型。这就是语言的工作方式。在更专业的层面上,类型的存在可能有助于将行识别为定义而不是表达式。

【讨论】:

所以你是说我不需要显式使用 Game* 进行初始化部分,但添加它是一个好习惯,因为它使代码更易于理解 @rudrasarkar 不,你误会了。此处需要Game*Game* 是定义的一部分,初始化是= 0 @rudrasarkar 除了回答你的问题,JaMiT 还在纠正你的术语。如前所述,您所拥有的基本上是一个定义,而定义需要一个类型。

以上是关于对于在其类声明之外的静态成员初始化,是不是有必要提供其类型?的主要内容,如果未能解决你的问题,请参考以下文章

C++ - 使用 Visual Studio 声明成员函数

Xamarin - 如何在其类之外使用列表

为啥静态成员函数只能在类定义中声明为静态,而不能在其自己的定义中声明?

静态常量非整形成员变量的初始化问题

第十二章 类和动态内存分配

静态字段静态函数成员常量