2017-03-02 18 views
-1

我並不完全確定我的情況措辭使得很難找到答案。基本上如果有一個A類擁有另一個B類私有成員(具有一種關係),那麼我該如何去做A類的構造函數呢?如何在某個功能中將某個類作爲類型傳遞

類的構造函數:

classA::classA(int a, int b, classB c); 

這給了我「錯誤:調用沒有匹配的函數‘CLASSB :: CLASSB()’,然後根據他們的論點多少我提供的名單的候選人;也當然是'期望的主要功能'。我可能錯過了一些相當大的代碼,這就是代碼非常普遍的原因,所以我只需要一個通用的答案來指向正確的方向。您可以假設B和A的其餘代碼儘可能最小。謝謝!

+0

這將是有益的,如果你還可以添加構造函數的代碼。無論如何,看起來好像A的構造函數試圖用一個不帶參數的構造函數初始化它的B成員,而後者沒有。 – mcrlc

+0

沒有足夠的上下文。 classA:classA中的單個冒號是可疑的。這是goto的標籤嗎? –

+0

這會改善您的問題,以顯示涉及的代碼。 [請參閱發佈指南](http://stackoverflow.com/help/mcve) –

回答

0

下面的聲明應該工作。

class classB 
{ 
public : 
    int b; 
    classB() 
    { 
     b = 1; 
    } 
}; 

class classA 
{ 
public: 
    classA(int a, int b, classB c) 
    { 
     ;// 
    } 
}; 

int main() 
{ 
    classB b; 
    classA a(1, 2, b); 

    return 0; 
} 

現在,我猜你可能做的是,你的classB聲明後classA

class classA{ 
    ... 
} 

class classB{ 
    ... 
} 

做到最後,如果classB是聲明在classA之內,將其傳遞給構造函數,它必須是靜態的。喜歡這個。

class classA 
{ 
public: 
    static class classB 
    { 
    public: 
     int b; 
     classB() 
     { 
      b = 1; 
     } 
    }; 


    classA(int a, int b, classB c) 
    { 
     ;// 
    } 
}; 

int main() 
{ 
    classA::classB b; 
    classA a(1, 2, b); 

    return 0; 
} 
+0

我認爲他在暗示'B類包含成員變量'A a;' –

+0

是的,謝謝。編輯。 – Ultraviolet

1

據我所知,在類A中有一個私有成員B,您沒有在構造函數的初始化列表中進行初始化。因此,調用B的默認構造函數,因爲錯誤提示不可用。

class A { 
    B b; 
public: 
    A(/* parameters */) 
    : b(/* parameters to construct b */) // missing part 
    { } 
}; 
相關問題