【问题标题】:Pointer to static member variable [duplicate]指向静态成员变量的指针[重复]
【发布时间】:2012-07-15 07:12:45
【问题描述】:

可能重复:
C++: undefined reference to static class member

以下 C++ 代码编译良好(使用 g++ -c)但它没有链接给出错误:undefined reference toAbc::X'`

#include <iostream>

using namespace std;

class Abc {

public:
    const static int X = 99;
};

int main()
{
    Abc a1;
    cout << &(Abc::X) << endl;
}

我想知道为什么不允许这样做?

【问题讨论】:

    标签: c++ pointers static-variables


    【解决方案1】:

    您需要实际定义该静态成员,而不仅仅是声明...

    在您的main() 之前添加这一行:

    const int Abc::X = 99;
    

    从 C++17 开始,您还可以进行内联静态处理,在这种情况下,不需要 .cpp 文件中的上述附加代码行:

    class Abc {
    
    public:
        inline const static int X = 99; // <-- "inline"
    };
    

    【讨论】:

    • 还将类内的语句更改为: const static int X;
    • 我希望 Ravi 能自己做这件事作为额外的功劳 ;-)
    【解决方案2】:

    如果静态成员以需要左值的方式使用(即以需要它有地址的方式),那么它必须有一个定义。请参阅the GCC wiki 的说明,其中包括对标准的引用以及如何修复它。

    【讨论】:

      【解决方案3】:

      如果您不喜欢考虑翻译单元、静态初始化顺序和类似的东西,只需将静态常量更改为方法即可。

      #include <iostream>
      using namespace std;
      
      class Abc {
      
      public:
          inline static const int& X(){ 
            static int x=99;
            return x; 
          }
      };
      
      int main()
      {
      //    Abc a1;
          cout << &(Abc::X()) << endl;
      }
      

      【讨论】:

      • 其实并不是在寻找快速的解决方案。很高兴阅读有关“翻译单元、静态初始化顺序和类似内容”的详细说明(或说明链接)。
      • 对。 SO和google上有很多关于这些话的内容。或者更好的是,此列表中的任何入门级书籍:stackoverflow.com/questions/388242/…,也许我稍后会添加更多。
      猜你喜欢
      • 2011-02-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-01-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-11-08
      相关资源
      最近更新 更多