2012-02-06 183 views
4

我在初始化嵌套類構造函數時遇到問題。如何在C++中初始化嵌套類的構造函數

這裏是我的代碼:

#include <iostream> 

using namespace std; 

class a 
{ 
public: 
class b 
{ 
    public: 
    b(char str[45]) 
     { 
     cout<<str; 
     } 

    }title; 
}document; 

int main() 
{ 
    document.title("Hello World"); //Error in this line 
    return 0; 
} 

我得到的錯誤是:

fun.cpp:21:30: error: no match for call to '(a::b)' 
+2

什麼是錯誤訊息? – 2012-02-06 12:43:13

+0

@OliCharlesworth fun.cpp:21:30:錯誤:不匹配呼叫'(a :: b)' – sandbox 2012-02-06 12:46:49

回答

1

你必須要麼使你的數據成員的指針,或者你只能調用數據成員的構造從它是成員類的顧問的初始化列表(在這種情況下,a

6

您可能想要類似於:

class a 
{ 
public: 
    a():title(b("")) {} 
    //.... 
}; 

這是因爲title已經是a一員,但你不必爲它的默認構造函數。可以編寫一個默認構造函數或將其初始化爲初始化列表。

1

此:

document.title("Hello World"); 

不是 「初始化嵌套類」;它試圖在對象上調用operator()

當您創建document時,嵌套對象已經初始化。除此之外,因爲你沒有提供默認的構造函數。

0

那麼你在這裏:

class A { 
    B title; 
} 

沒有定義構造函數A類(如圖所示Luchian格里戈裏)標題將被初始化爲:B title();

您可以工作,圍繞由:

A::A():title(B("Hello world")) 

// Or by adding non parametric constructor: 
class B { 
    B(){ 

    } 

    B(const char *str){ 

    } 
} 

對象標題(在文檔中)已經初始化,您不能再調用構造函數,但仍可以使用語法:document.title(...)通過聲明並確定operator(),但它不會是構造了:

class B { 
    const B& operator()(const char *str){ 
    cout << str; 
    return *this; 
    } 
}