【问题标题】:use parameterized constructor in other classes constructor在其他类构造函数中使用参数化构造函数
【发布时间】:2025-12-04 04:10:02
【问题描述】:

我担心这是一个非常基本的问题,但是我还没有解决它。

我有一个class A

// classA.h
...

class ClassA {
    public:
        ClassA();
        ClassA(int foo);
    private:
        int _foo;

    ...

}

// classA.cpp

ClassA::ClassA() {
    _foo = 0;
}

ClassA::ClassA(int foo) {
    _foo = foo;
}

...

第二个class B 在构造函数中使用class A 的实例:

// classB.h
...

#include "classA.h"

#define bar 5

class ClassB {
    public:
        ClassB();
    private:
        ClassA _objectA;

    ...

}

// classB.cpp

ClassB::ClassB() {
    _objectA = ClassA(bar);
}

...

请注意,class A 的默认构造函数从未使用过。事实上,在我的实际用例中,使用任何类型的默认构造函数甚至都没有意义,因为必须动态分配 _foo

但是,如果我删除默认构造函数,编译器会返回错误:

没有匹配的函数调用'ClassA::ClassA()'

有没有办法在不为class A 定义默认构造函数的情况下使用class A 的实例作为class B 中的对象?这将如何实现?

【问题讨论】:

  • 请注意,A 类的默认构造函数从未使用过 -- 使用您当前的代码,它在此处使用:ClassA _objectA; 即使您不是故意的这样做。

标签: c++ constructor instance-variables default-constructor


【解决方案1】:

使用ClassA的默认构造函数。 ClassB_objectA 用它初始化,然后你将 ClassA(bar) 分配给它。

您可以使用constructor initializer lists解决您的问题:

ClassB::ClassB() : _objectA(bar)
{}

【讨论】:

  • 谢谢!您的回答引出了一个后续问题,但它更进一步:)
【解决方案2】:

随便写

ClassB::ClassB() :  _objectA(bar)
{
}

问题是当ClassB的构造函数的主体被执行时,数据成员_objectA已经被构造并且在主体内部使用了复制赋值运算符

ClassB::ClassB() {
    _objectA = ClassA(bar);
   ^^^^^^^^^^^^^^^^^^^^^^^^
}

因此您可以删除ClassA 的默认构造函数。

【讨论】:

  • 谢谢!您的回答引出了一个后续问题,但它更进一步:)