2012-06-15 41 views
0

我有兩個類,一個在另一箇中,我想在外部類構造函數的主體中構造內部類。我有我認爲應該是正確的代碼,但它不起作用。該錯誤消息似乎告訴我沒有VSL :: VSL()與我的調用相匹配,但它似乎是正確的原型。構造函數中的遲建構

的代碼看起來是這樣的:

在頭

class VSL 
{ 
    VSL(vector<string> &v, string &s); 
}; 
class KVTest 
{ 
    VSL vsl; 
    KVTest(int argc, char *argv[]); 
}; 

身體:

KVTest::KVTest(int argc, char *argv[]) { 
    vector<string> v; 
    string s; 

    vsl(v, s); 
} 

這失敗,出現以下錯誤信息:

src/util/kv-test/kv-test.cpp: In constructor 'KVTest::KVTest(int, char**)': 
src/util/kv-test/kv-test.cpp:237: error: no matching function for call to 'VSL::VSL()' 
src/util/kv-test/kv-test.cpp:112: note: candidates are: VSL::VSL(std::vector<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::basic_string<char, std::char_traits<char>, std::allocator<char> > > >&, std::string&) 
src/util/kv-test/kv-test.h:45: note:     VSL::VSL(const VSL&) 
src/util/kv-test/kv-test.cpp:347: error: no match for call to '(VSL) (std::vector<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::basic_string<char, std::char_traits<char>, std::allocator<char> > > >&, std::string&)' 

第2行37是KVTest的構造函數聲明 第347行是該構造函數中被調用的構造函數的行 第112行是VSL構造函數聲明 頭的第45行是{開始VSL類 我沒有顯式複製VSL的構造函數

+0

所有的構建和變量返回的對象的副本這個例子是私有的。這是問題嗎? – pmr

回答

3

當您進入KVTest::KVTest正文的內部時,vsl已經被初始化;你不能再次調用構造函數。但沒有默認的(即零參數)構造函數,因此編譯器錯誤消息。

你有兩個選擇:

  1. 聲明默認構造函數VSL
  2. 使用constructor initialisation list明確地初始化vsl。這通常會是這個樣子:

    KVTest::KVTest(int argc, char *argv[]) 
    : vsl(foo, bar) 
    {} 
    

    如果需要執行涉及的臨時變量等複雜的初始化,那麼你應該考慮寫一個返回VSL的私人助手功能。

1

首先,它不是一個「內部類」,它是一個數據成員。

現在比較您的代碼以聲明和初始化一個int

int i = 0; 

不能創建一個int通過寫

i(0); 

同樣,這並不構造vsl

vsl(v, s); 

它已經在構造函數啓動的主體之前構建,或者如果您有一個默認的構造函數,它可以在沒有任何參數的情況下構造。

構建必須聲明它的對象:

VSL vsl(v, s); 

但對於一個成員變量,它已經宣佈,所以你不能這樣做,在構造函數體。

如果你有一個默認的構造函數,你可以更新構造函數體中的變量,通過給它分配一個新值:

vsl = VSL(v, s); 

只要你的類型有一個正確編寫的賦值運算符。

或者你也可以在合適的時間進行初始化,在構造函數初始化列表:

KVTest::KVTest(int argc, char *argv[]) 
:vsl(createVSL()) 
{ 
} 

這將創建它通過createVSL()

VSL createVSL() 
{ 
    vector<string> v; 
    string s; 
    VSL vsl(v, s); 
    return vsl; 
}