2017-09-14 123 views
0

我有兩個類,A類和B類。我不想讓它們中的任何一個具有默認構造函數,因爲它們都需要實例化帶參數。然而,我似乎無法在類B中創建類A的對象,而無需使用默認的公共構造函數,該類允許在沒有用戶定義的值的情況下實例化類(試圖避免默認值)。在沒有指針的情況下,在另一個類構造函數中沒有默認構造函數的C++實例化對象

這是我的設置:

對象我想其他B級的內部進行初始化的類:

ClassA.h

Class A //No default constructor 
{ 
public: 
    A(int var1, int var2); //Class A's Constructor 
} 

我想創建此對象的實例當B類被實例化時,這是實例化的,因爲我需要傳入類B的值來實例化類A.

ClassB.h

Class B //No default Constructor 
{ 
public: 
    A myClassA; //The public variable in class B I want to hold an object of class A 

    int somePublicVar; 

    B(int var1, int var2, int var3); //Class B's Constructor 

} 

我似乎無法得到類型A的myClassA對象來實例化。

ClassB.cpp

B::B(int var1, int var2, int var3) 
{ 
    B = A(var1, var2); 
    somePublicVar = var3 

} 

我是新來的C++,但我很熟悉C#和C,但我似乎無法找到正確的語法/過程來完成這一點。

我已經閱讀了與這個問題有關的問題,使用指針來實現這一點似乎是「初學者」的方式來解決這個問題,因爲對象將需要手動銷燬,所以我試圖沒有指針就可以做到這一點。可能嗎?這個過程的最佳做法是什麼?

,如果我一定要做到這一點,我將訴諸三分球,但我與操作掙扎過,因爲如果我定義了一個爲指針,而不是一個對象,我得到一個錯誤,當我這樣做:

myClassA = & A(var1,var2);因爲我的理解是「A(var1,var2)」的作用域是構造函數,並且在構造函數完成之後將被刪除,所以我們不能使用這個擴展名,所以我們不能保存一個指針。所以我不確定我會如何在這種情況下使用指針方法。

我似乎只能找到這個問題的部分答案,但沒有一個似乎滿足所有條件。我很感激幫助。

編輯17年9月14日:

我忘了提,我也想有myClassA爲B類的內部公共變量如果我沒有默認的構造函數,我該怎麼預防這從給我的「沒有默認構造函數」錯誤?

-Thanks先進

回答

4
B::B(int var1, int var2, int var3) : myClassA(var1, var2) 
{} 
+0

謝謝。我喜歡這麼快速的回覆。但是,我怎樣才能將myClassA定義爲類B中的公共變量?它一直給我默認的構造函數錯誤。 – WhatIsASyntax

+0

@WhatIsASyntax它不應該犯一個錯誤。檢查所有可能嘗試調用'A'的默認構造函數的地方。這裏有一個實例,它顯示輸出中沒有編譯器錯誤:http://coliru.stacked-crooked.com/a/d94463408244b094 –

+0

@WhatIsASyntax如果你想要一個指向'A'的指針作爲'B'的成員,你可以做這樣的事情:'class B {unique_ptr p; B :: B(int var1,int var2,int var3){p = make_unique (var1,var2);}'。 – AlexD

1

Alex的上述解釋當然是正確的,但這裏有一個鏈接,你太:http://en.cppreference.com/w/cpp/language/initializer_list

基本上,如果它是「後:但在構造函數體之前」它是與這些論點「構建」的。默認構造函數永遠不會被調用。由於您只定義了一個非默認構造函數,因此您的class A沒有無參數構造函數。

+0

非常感謝。這使得更多的意義!我不明白AlexD的答案如何解決公共變量聲明,但這解釋了一切。謝謝。 – WhatIsASyntax

相關問題