如何在类中访问全局数据成员和成员函数?

时间:2014-07-01 15:11:43

标签: c++

我已经声明了一个全局数据和全局函数,当我尝试在类编译器中访问时抛出错误为"我不能出现在常数表达中,为什么?

  #include<iostream>
  using namespace std;
  int i=20;

  void fn()
  { 
    cout<<" I am outside class"<<endl;
  }

  class a
  {
      public: 

        int x= ::i;  // error is  i cannot appear in constant expression

        void accessGlobal()
        {

           ::fn();      //fn() is being called
        }
  };

  int main()
  {
     a obj;
     obj.accessGlobal();
  }

2 个答案:

答案 0 :(得分:2)

您的问题与全局变量无关,但与类成员初始化有关。

使用x尝试的是类内成员初始化,并且自C ++ 11以来在C ++中受支持,标准部分§12.6.2:

  

在非委托构造函数中,如果给定的非静态数据成员或   基类不是由mem-initializer-id指定的(包括   因为构造函数没有mem-initializer-list的情况   没有ctor-initializer)并且实体不是虚拟基类   抽象类(10.4),然后

     
      
  • 如果实体是具有大括号或等于初始化程序的非静态数据成员,则实体初始化为   8.5;
  •   

解决方案:

  • 使用C ++ 11编译器并添加对C ++ 11的支持(-std = c ++ 11)。看到它正常工作here
  • 如果你真的不能,请按照惯例并提供构造函数来初始化你的成员:

示例:

a() : x(::i) {}

答案 1 :(得分:-1)

你需要使用C ++ 11标准来编译这段代码,在以前的标准中禁止在类的定义中定义非静态变量(类的构造函数应该这样做)。遵循旧标准,您还可以尝试在变量声明之前添加static关键字,并在类定义之后对其进行初始化:

class a {
    public:
        static int x;
};
int a::x = ::i;