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

How Access of global data member and member function in a class?

本文关键字:全局 数据成员 函数 成员 何访问 访问      更新时间:2023-10-16

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

  #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();
  }

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

你想用x做的是类内成员初始化,从c++ 11开始,标准节§12.6.2:

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

  • 如果实体是具有大括号或等号初始化式的非静态数据成员,则该实体按照8.5;

解决方案:

  • 使用c++11编译器并添加对c++11的支持(-std=c++11)。
  • 如果你真的不能,就像往常一样,提供一个构造函数来初始化你的成员:

例子:

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

您需要使用c++ 11标准来编译此代码,在以前的标准中禁止在类的定义内部定义非静态变量(类的构造函数应该这样做)。按照旧的标准,您还可以尝试在变量声明之前添加static关键字,并在类定义之后初始化它:

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