2016-09-16 259 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

@πάνταῥεῖ - 他说我们想从指针改变它 –