2012-11-01 99 views
1

我有一些問題需要聲明std::vector<std::string>類型的靜態成員,原則上我可以用一個數組std::string[]替換它。如何聲明一個靜態向量成員

我有很多麻煩:如果我聲明它爲static,然後我在實現(cpp文件)初始化它的作品,但如果我想創建一個新的類繼承自第一個文件它抱怨約

error: invalid application of ‘sizeof’ to incomplete type ‘std::string []’ 

如果我decalre它在頭我有雙重聲明的問題。

什麼是正確的方法?我必須使用extern嗎?怎麼樣?

我有:

file_A.h:

class A { public: static string s[]; } 

file_A.cpp:

string A::s[] = { ... }; 

file_B.h

class B : public A 

file_B.cpp

void B::function() 
{ 
for (string* s = A::s; s != A::s + sizeof(A::s)/sizeof(string); ++s) 
} 
+1

'std :: vector '不是函數類型。這是一個班級類型。 –

+0

它怎麼抱怨?這真的是你file_B.h中的所有內容嗎? – PlasmaHH

+0

第一個應該可以正常工作。你遇到了什麼錯誤?什麼編譯器? – 2012-11-01 12:54:48

回答

0

你的錯誤是,你正在嘗試sizeof string s[]。編譯器不知道你的字符串數組的大小。

例如:

void B::function() 
{ 
for (string* s = A::s; s != A::s + sizeof(A::s)/sizeof(string); ++s) 
} 

在你的函數代替的sizeof()。您可以使用for (int i = 0; !A::s[i].empty(); ++i)來獲取字符串數組的大小。

PS。如果你不使用sizeof(string [])。你的代碼將工作。

+0

你這個問題是正確的,但你所建議的「解決方案」將最有可能只是給分段錯誤,除非WISO決定總是「標記」數組的通過將一個空字符串有結束。 (特別是,如果數組中的每個字符串都是非空的,那麼你將最終訪問超出數組末尾的內存,導致未定義的行爲) –

+0

@Edward Loper,我同意你的看法。但是,實際上,我提出了僞代碼。不要說使用它。例如:) – Ruu

1

您誤解了sizeof運營商正在做的事情。它給你的數據大小類型,而不是實際的數據。有時,數據類型的大小恰好與實際數據的大小相同。這只是情況下,當數據類型本身定義了多少數據可以適應它:

int a[50]; // 50 ints: sizeof(a) == 50 * sizeof(int) 

此外,sizeof可以在一個完整的類型只操作。這不是一個完整的類型:

int a[]; 

一個不完整的類型是缺乏以確定其大小所需的信息類型。您將永遠無法使用sizeof在此處獲得a的大小。

+0

爲什麼'字符串A :: S [] = {...};'不完整? –

+0

'int a [50]; // sizeof(a)== 50' 錯誤 - 'int a [50]; // sizeof(a)== sizeof(int)* 50' Right – Ruu

+0

@Ruu Oopsie ...感謝您的支持。 –