2016-09-16 256 views
0

首先,我不是在談論這些問題(1,2)。我正在談論一個已經有構造函數的類,它只能被值嵌套,而不是定義......如果這是有道理的。如何調用嵌套類的構造函數

目前,我有這樣的方法,其工作原理,但使用new是醜陋IMO:

class A { 
private: 
    int value; 

public: 
    A(int _value); 
}; 

class B { 
private: 
    A *a; 
public: 
    B(int _value); 
}; 

B的構造函數:

B::B(int _value) 
{ 
    a = new A(_value); 
} 

如果我改變A *a;A a,我將如何創建B,以便以相同的方式調用A的構造函數?

我已經試過:

B::B(int _value) 
{ 
    a = A(_value); // no matching function for call to ‘A::A()’ 
    a = A::A(_value); // cannot call constructor ‘A::A’ directly 
    a(_value);  // no match for call to ‘(A) (int&)’ 
    a.A(_value);  // invalid use of `A::A` 
} 

這似乎並不可能,而不:

  • 使用指針與new
  • 使用一些明確的void A::init(_value)(將需要額外的構造函數A不採取任何論據)
  • 擴展類A(將需要更改特定私人成員保護和W烏爾德齧合他們的「命名空間」,在不希望的方式)
  • 可疑使用memcpy()A temp(_value); memcpy(&a, &temp, sizeof (A));

不訴諸於上述方法這是可能的?

+0

使用引用成員和構造函數初始值設定項列表。 –

+0

在這種情況下,參考文獻對價值有什麼優勢?看起來兩者都是在創建'B'時創建的,並且兩者具有相同的用法語法和語義。 –

+0

不,我可能剛剛把你的問題弄錯了。 –

回答

1

您使用初始化列表。

I.e. B構造函數看起來像

class B { 
    ... 

    A a; 
}; 

B::B(int _value) : a(_value) { 
    ... 
} 
+0

'a'實際上是一個指針! –

+1

@πάνταῥεῖOP正試圖擺脫這種情況。 –

+0

@πάνταῥεῖ - 他說我們想從指針改變它 –