2010-01-22 94 views

回答

18
//Header File 
class test 
{ 
    const static char array[]; 
}; 

// .cpp 
const char test::array[] = { '1', '2', '3' }; 
+0

謝謝,是不知道你是否可以在成員身邊這樣做。 – user174084 2010-01-22 13:07:22

+8

定義中沒有靜態的,請。 – 2010-01-22 13:07:45

+1

爲什麼人們強調顯然不能編譯的代碼? – 2010-01-22 13:08:50

42

的最佳地點將是在源文件中

// Header file 
class test 
{ 
    const static char array[]; 
}; 

// Source file 
const char test::array[] = {'1','2','3'}; 

您可以在類的聲明就像你試圖做初始化整數類型;所有其他類型必須在類聲明之外初始化,並且只能使用一次。

+0

不應該說「......在課堂*聲明* ...」嗎?我認爲'.h'是聲明,'.c'是定義,因此爲什麼只引用頭中聲明的整數類型會導致編譯器錯誤:'未定義的對test :: SOME_INTEGER的引用? (我意識到這聽起來超級挑剔和迂腐,我不想變得困難;我只是想確保我使用正確的術語,所以如果我錯了,絕對糾正我)。 – dwanderson 2016-02-15 15:55:21

22

你總是可以做到以下幾點:關於這個範式

class test { 
    static const char array(int index) { 
    static const char a[] = {'1','2','3'}; 
    return a[index]; 
    } 
}; 

一對夫婦的好東西:

+1

我無法讓編譯器有'&a [1]'在多個對象上保持一致。 – Alex 2014-04-30 13:28:36

+0

對於字符串文字,這是完美的! – sage 2015-03-23 03:30:51

+2

您的鏈接「靜態初始化失敗」已死。 – sergiol 2015-05-28 13:54:47

5

現在,在C++ 17,可以使用內變量

How do inline variables work?

A simple static data member(N4424):

struct WithStaticDataMember { 
    // This is a definition, no out­of­line definition is required. 
    static inline constexpr const char *kFoo = "foo bar"; 
}; 

在您的例子:

//Header File 
class test 
{ 
    inline constexpr static char array[] = { '1', '2', '3' }; 
}; 

應該只是工作