如何调用嵌套类的构造函数[重复]
Posted
技术标签:
【中文标题】如何调用嵌套类的构造函数[重复]【英文标题】:How to call constructor of a nested class [duplicate] 【发布时间】:2016-09-16 00:44:19 【问题描述】:首先,我不是在谈论这样的问题(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 类(需要将特定的私有成员更改为受保护的,并且会以不想要的方式网格化它们的“命名空间”)
memcpy()
(A temp(_value); memcpy(&a, &temp, sizeof (A));
) 的使用有问题
如果不采用上述方法,这可能吗?
【问题讨论】:
使用引用成员和构造函数初始化列表。 在这种情况下,引用比值有什么优势吗?似乎两者都是在创建B
时创建的,并且都具有相同的使用语法和语义。
不,我可能只是把你的问题弄错了。
@BradenBest 如果您没有理由使用参考,请不要。一个普通的A a;
肯定是你想要的。
【参考方案1】:
您使用初始化列表。
即B构造函数看起来像
class B
...
A a;
;
B::B(int _value) : a(_value)
...
【讨论】:
a
实际上是一个指针!
@πάνταῥεῖ 这正是 OP 试图摆脱的。
@πάνταῥεῖ - 他说我们想从指针改变它
@πάνταῥεῖ 为什么他需要参考?
@πάνταῥεῖ 你在说什么?我希望 a
是一个值 (A
),而不是指针 (A*
),而不是引用 (A&
)。这个答案回答了我的问题,并准确地给出了我的要求。案件结案。以上是关于如何调用嵌套类的构造函数[重复]的主要内容,如果未能解决你的问题,请参考以下文章