2012-06-07 39 views
10

我完全不熟悉C++,所以忍耐着我。我想用靜態數組創建一個類,並從main訪問這個數組。這是我想要在C#中完成的任務。C++數據成員初始化不允許

namespace ConsoleApplication1 
    { 
     class Program 
     { 
      static void Main(string[] args) 
      { 
       Class a = new Class(); 
       Console.WriteLine(a.arr[1]); 

      } 
     } 
    } 

    ===================== 

    namespace ConsoleApplication1 
    { 
     class Class 
     {  
      public static string[] s_strHands = new string[]{"one","two","three"}; 
     } 
    } 

這裏是我曾嘗試:

// justfoolin.cpp : Defines the entry point for the console application. 
// 

#include "stdafx.h" 
#include <string> 
#include <iostream> 
using namespace std; 

class Class { 

    public: 
     static string arr[3] = {"one", "two", "three"}; 
}; 


int _tmain(int argc, _TCHAR* argv[]) 
{ 
    Class x; 
    cout << x.arr[2] << endl; 
    return 0; 
} 

但我得到: 智能感知:數據成員初始化不允許

+0

沒有我gusta'使用namespace std;' –

回答

16

以後需要進行初始化;你不能在類定義中初始化類成員。 (如果你能,然後在頭文件中定義的類會導致每個翻譯單元定義自己成員的副本,使連接器與一個爛攤子整理。)

class Class { 
    public: 
     static string arr[]; 
}; 

string Class::arr[3] = {"one", "two", "three"}; 

類定義定義了接口,它與執行分開。

+0

具有整數類型的靜態數據成員可以在C++ 03中內聯初始化,儘管如果它們將被用作對象時它們仍然必須被定義。大多數(所有?)數據成員可以在C++ 11中內聯初始化,但Visual C++尚不支持此功能。 –

+0

我不認爲C++ 11會對靜態數據成員,只有實例數據成員進行任何更改。當編譯構造函數時,編譯器看到的任何以前初始化的實例成員都會在構造函數中隱式初始化,並且顯示默認值。沒有什麼魔法可以使靜態成員可以工作。一個符號必須放在* some *翻譯單元中。 – cdhowie

+0

你是對的。我的第二句話應該是「大多數非靜態數據成員」。抱歉的混淆。 –

1

只有靜態的整型數據成員可以在類定義中初始化。您的靜態數據成員類型爲string,因此無法以內聯方式初始化。

您必須定義arr以外的類定義,並在那裏初始化它。您應該在課後移除聲明的初始化函數和以下:

string Class::arr[3] = {"one", "two", "three"}; 

如果你的類是在頭文件中定義,它的靜態數據成員應該在一個源(的.cpp)文件中定義。

另請注意,並非所有出現在Visual Studio錯誤列表中的錯誤都是生成錯誤。值得注意的是,以「IntelliSense:」開頭的錯誤是IntelliSense檢測到的錯誤。 IntelliSense和編譯器並不總是同意。

+0

只有靜態const整型數據不是靜態整型數據成員。 –

0

你必須初始化靜態成員的類中聲明之外:

string Class::arr[3] = {"one", "two", "three"}; 
2

您必須初始化靜態成員在類的外部,就好像它是一個全局變量,像這樣:

class Class { 

    public: 
     static string arr[3]; 
}; 

string Class::arr = {"one", "two", "three"}; 
+0

只是爲了添加靜態const型數據成員而可以在類中初始化。 –