2014-07-01 79 views
1

我已經聲明瞭全局數據和全局函數,當我嘗試在類編譯器中訪問時拋出錯誤爲「我不能出現在常量表達式中」,爲什麼?如何訪問全局數據成員和類中的成員函數?

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

什麼編譯器?在這裏編譯:http://ideone.com/ig4sXo – quantdev

+2

'int x = :: i;'在C++中,你不能在同一行聲明和初始化一個成員變量。初始化應該在構造函數中進行。 – crashmstr

+0

您的示例在C++ 11標準中是合法的,它引入了非靜態數據成員初始值設定項,但在C++ 98標準編譯中將導致錯誤。 – undermind

回答

2

您的問題沒有與全局變量相關,但與類成員的初始化。

你正在嘗試與x做的是一流成員初始化既然C++ 11是用C++的支持,標準節§12.6.2:

在非委託構造,如果某個給定的非靜態數據成員或基類不是由mem-initializer-id指定的(包括 由於構造函數 沒有ctor初始值設定項而沒有mem-initializer-list的情況)以及實體不是虛擬基類 抽象類(10.4),然後

  • 如果實體是具有括號或等於初始值設定項的非靜態數據成員,則按照 8.5中指定的方式對實體進行初始化;

解決方案:

  • 使用C++編譯器11,並添加用於C++ 11(-std = C++ 11)的支持。看它工作here
  • 如果你真的不能,做平常,並提供一個構造函數來初始化您的會員:

例子:

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

您需要使用C++ 11的標準編譯這段代碼,在以前的標準,它是被禁止的定義類(類應該做的構造函數)的定義內部的非靜態變量。繼老標準你也可以試試在類定義之後變量聲明之前添加static關鍵字和初始化:

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

是的,它不是,但它取決於情況,只要它符合程序員的期望。這樣你可以像例子中那樣初始化變量,但是對於這個類它會變成靜態的。 – vnd

相關問題