【问题标题】:How to call constructor of a nested class [duplicate]如何调用嵌套类的构造函数[重复]
【发布时间】:2016-09-16 00:44:19
【问题描述】:

首先,我不是在谈论这样的问题(12)。我说的是一个已经有构造函数并且仅按值嵌套的类,而不是按定义嵌套...如果这有意义的话。

目前,我有这种方法,它有效,但使用 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; 肯定是你想要的。

标签: c++ class memory-management constructor


【解决方案1】:

您使用初始化列表。

即B构造函数看起来像

class B {
   ...

   A a;
};

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

【讨论】:

  • a 实际上是一个指针!
  • @πάνταῥεῖ 这正是 OP 试图摆脱的。
  • @πάνταῥεῖ - 他说我们想从指针改变它
  • @πάνταῥεῖ 为什么他需要参考?
  • @πάνταῥεῖ 你在说什么?我希望 a 是一个值 (A),而不是指针 (A*),而不是引用 (A&)。这个答案回答了我的问题,并准确地给出了我的要求。案件结案。
猜你喜欢
  • 2023-04-03
  • 2014-06-11
  • 2018-02-27
  • 2017-01-05
  • 1970-01-01
  • 2015-07-03
  • 2012-12-25
  • 1970-01-01
  • 2015-09-30
相关资源
最近更新 更多