如何调用嵌套类的构造函数[重复]

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&)。这个答案回答了我的问题,并准确地给出了我的要求。案件结案。

以上是关于如何调用嵌套类的构造函数[重复]的主要内容,如果未能解决你的问题,请参考以下文章

在其派生类C++的构造函数中调用基类的构造函数[重复]

父类的复制构造函数中的嵌套类缺少默认构造函数

c# 子类如何调用父类的构造函数

C++中如何在子类的构造函数中调用基类的构造函数来初始化基类成员变量

在java语言里如何在子类中调用父类的有参构造函数

带参数的Java私有构造函数[重复]