【问题标题】:Declaring an object with a parameterized constructor inside another class C++ [duplicate]在另一个类 C++ 中使用参数化构造函数声明对象 [重复]
【发布时间】:2020-10-18 08:52:19
【问题描述】:

我希望一个类的对象包含在另一个类中。

类 A 包含在类 B 中,如下面的简单示例所示。

问题是A类只有一个参数化的构造函数。

是否有另一种方法可以在 B 类中声明 A 类对象,而不必使用指向 A 类的指针?

class A
{
    public:
        A(int var1, int var2);
    private:
        //...
};

class B
{
    public:
        B();
    private:
        A  a;      // Compiler error 
        A* a_ptr; // This will of course work fine. We can create a new A object with parameters any time using the a_ptr
};

【问题讨论】:

  • 我猜这个编译器错误足以理解在这种情况下你可以做什么:---'B'的构造函数必须显式初始化没有默认构造函数的成员'a'
  • 很遗憾,您歪曲或误解了您的问题。 B 具有 A 类型的成员不会导致编译错误,除非 A 的定义对编译器不可见(例如,从先前包含的头文件中)。如果B 的构造函数尝试使用A 没有的构造函数来构造A,则会导致编译错误。将Bs 构造函数的定义更改为(假设没有在类B 的定义中内联)到B::B() : A (2,3) {},它将编译。 (我随机选择了23 的值来说明这一点)。
  • @Peter 你的意思是B::B() : a (2,3) {} (a 不是 A) 因为 B 不继承 A 并且你想为 aA 的构造函数提供参数

标签: c++ class pointers constructor


【解决方案1】:

一个; // 编译错误

除非 B 的构造函数显式调用带有所需参数的 A 的构造函数(例如 B() : a(an_int, an_int) {...}),否则请求一个没有参数的构造函数或所有参数都有默认值,但你没有那个构造函数,只有一个需要 2 个 int

的构造函数

是否有另一种方法可以在 B 类中声明 A 类对象,而不必使用指向 A 类的指针?

您不声明,而是定义/每次实例化BA的新实例

请注意,您可以稍后创建 A 的实例,而无需像 a_ptr 那样使用指针

std::vector<A> a;

当你知道 A 的实例时,你需要做的实例

a.push_back(A(an-int, an-int));

但您只需要一个实例这一事实在 a 的定义中不可见(出于欢迎评论)

【讨论】:

  • 为什么是DV?你能帮我理解它们吗?
  • 当然,我理解编译器错误。它试图通过使用不存在的非参数化构造函数来创建 A 类的对象。我怎样才能做到这一点而不必使用指针?我可以写 A a(int var1, int var2); B类内部
  • @Engineer999 正如我在回答中所说,您需要在 B 构造函数中显式调用 A 的唯一现有构造函数。您不能在类 B 中声明/定义 A 构造函数
  • 我可以使用初始化列表和 B 类的构造函数来初始化带有参数的对象 A a。这行得通。但是,如果我在构建 B 类时不知道要传递给 A 类构造函数的值,那么看起来我别无选择,只能使用指针?
  • @Engineer999 虽然您不知道要传递的值是的,但您无法实例化该类,但您可以使用例如向量稍后创建它,我编辑了我的答案
猜你喜欢
  • 2021-06-04
  • 2020-06-01
  • 2019-01-14
  • 1970-01-01
  • 2011-10-12
  • 1970-01-01
  • 1970-01-01
  • 2020-06-26
  • 1970-01-01
相关资源
最近更新 更多