none
如何在头文件中声明并初始化类的静态成员变量? RRS feed

  • 问题

  • 我希望在一个头文件中实现一个类,引用的时候只需要简单的include就可以了,所以不想再写一个cpp文件或者写成静态链接库。类的实现如下:

    namespace my_namespace
    {
    class my_class
    {
    public:
        //这里是一些公共函数
    private:
        static int num1;
        static other_custom_class occ;
    }
    
    int my_class::num1 = 0;
    other_custom_class my_class::occ;
    }

    但是编译器给出错误

    error LNK2005:***** 已经在 ***.obj中定义

    OS: Windows 8.1

    IDE: Visual Studio 2013

    请问我该如何做?

    2015年1月10日 4:35

答案

  • 那您可以将类的成员变量改为全局静态变量,如
    static int num1 = 0;
    static other_custom_class occ;
    但是定义全局变量时使用static,意味着该变量的作用域只限于定义它的源文件中,其它源文件不能访问。既然这种定义方式出现在头文件中,那么包含了该头文件的所有源文件中都定义了这些变量,即该头文件被包含了多少次,这些变量就定义了多少次。这样就相当于文件中定义的static变量会造成变量多次定义,造成内存空间的浪费,而且也不是真正的全局变量。虽然在代码中好像使用了相同的变量,但是实际上使用的是不同的变量,在每个源文件中都有单独的变量。应该避免使用这种定义方式。这样虽然在编译链接上没有任何问题,但是可能会导致逻辑上的错误。

    所以正确的做法:在h中声明,在cpp中定义。

    Visual C++ enthusiast, like network programming and driver development. At present is being engaged in the WinCE/Windows Mobile platform embedded development.

    • 已标记为答案 bloomstar 2015年1月13日 12:38
    2015年1月13日 2:14
    版主

全部回复

  • 你好:

          你试一下这个代码,可能是因为你少了一个分号:

    namespace my_namespace
    {
    class my_class
    {
    public:
        //这里是一些公共函数
    private:
        static int num1;
        static other_custom_class occ;
    };   //! 注意这里的分号。
    
    int my_class::num1 = 0;
    other_custom_class my_class::occ;
    }
    
    

    Shu Hu

    We are trying to better understand customer views on social support experience, so your participation in this interview project would be greatly appreciated if you have time. Thanks for helping make community forums a great place.
    Click HERE to participate the survey.

    2015年1月12日 1:51
  • 根据您给出的错误,是由于静态变量在不同编译单元中定义多次导致。举个例子,如果您这段代码位于"myclass.h"中,您有两个文件分别包含了这个myclass.h,当链接的时候就会由于定义多次报错。据我所知,唯一的解决办法就把静态变量定义是放在.cpp中。

    注:这不是#pragma once能解决的。


    Visual Basic 初学者 望关照!

    2015年1月12日 4:58
  • int my_class::num1 = 0;
    other_custom_class my_class::occ;
    这两句定义请写到.cpp源文件中.

    Visual C++ enthusiast, like network programming and driver development. At present is being engaged in the WinCE/Windows Mobile platform embedded development.

    2015年1月12日 10:40
    版主
  • 我知道写在cpp中是可以的,但是全局静态变量可以只在.h中声明和定义,所以我想知道类的静态成员变量是否可以只在.h中定义。

    我现在宁愿将类的成员变量改为全局静态变量,也不想增加cpp文件。

    2015年1月12日 13:36
  • 我知道写在cpp中是可以的,但是全局静态变量可以只在.h中声明和定义,所以我想知道类的静态成员变量是否可以只在.h中定义。

    我现在宁愿将类的成员变量改为全局静态变量,也不想增加cpp文件。

    2015年1月12日 13:37
  • 那您可以将类的成员变量改为全局静态变量,如
    static int num1 = 0;
    static other_custom_class occ;
    但是定义全局变量时使用static,意味着该变量的作用域只限于定义它的源文件中,其它源文件不能访问。既然这种定义方式出现在头文件中,那么包含了该头文件的所有源文件中都定义了这些变量,即该头文件被包含了多少次,这些变量就定义了多少次。这样就相当于文件中定义的static变量会造成变量多次定义,造成内存空间的浪费,而且也不是真正的全局变量。虽然在代码中好像使用了相同的变量,但是实际上使用的是不同的变量,在每个源文件中都有单独的变量。应该避免使用这种定义方式。这样虽然在编译链接上没有任何问题,但是可能会导致逻辑上的错误。

    所以正确的做法:在h中声明,在cpp中定义。

    Visual C++ enthusiast, like network programming and driver development. At present is being engaged in the WinCE/Windows Mobile platform embedded development.

    • 已标记为答案 bloomstar 2015年1月13日 12:38
    2015年1月13日 2:14
    版主