1

我可以知道如何在另一个类中使用重载的构造函数进行对象组合,这是一个示例代码:

class A {
    int a;

    A( int inputA ) { a = inputA; }
};

class B {
    A objectA;

    B( A inputObjectA ) { objectA = inputObjectA; }
};

编译器的错误是没有默认构造函数 A::A() ?

有没有办法编辑B的构造函数的参数中的代码以接受A中的重载构造函数?

4

4 回答 4

2

如果孩子没有默认构造函数,则父母的构造函数应该传递参数。

class A {
public:
    int a;
    A( int inputA ) { a = inputA; }
};

class B {
    A objectA;
public:
    B( A inputObjectA ): objectA(inputObjectA.a) { }
};

http://ideone.com/QavhfY

在您的情况下,为 A 使用复制构造函数是合适的,而不是将其成员公开:

class A {
    int a;
public:
    A( int inputA ) { a = inputA; }
};

class B {
    A objectA;
public:
    B(A inputObjectA ): objectA(inputObjectA) { }
};

http://ideone.com/wX1clr

于 2013-11-10T05:36:21.930 回答
1

在您的 B 类对象中,您有

A objectA;

那是调用默认构造函数的时候,所以你需要有一个指定的默认构造函数,或者你可以使用默认参数,例如

A( int inputA = 0 ) { a = inputA; }

然后,这将扮演将整数 a 设置为 0 的角色,当您调用默认构造函数时,它实际上会实现与

A() { a = 0; } 

虽然你不必设置 a 如果你不想,但由于你声明了一个非默认构造函数,它不再为你隐式创建一个。所以你至少需要

A(){ }  

你可以做的另一种方法是

class A {
    int a;
    void setSomething(int val) { a = val; }
};

class B {
    A objectA;
    B( A inputObjectA ) { objectA = inputObjectA; }
};

这是有效的,因为您从未声明任何构造函数,因此它将为您隐式创建一个默认构造函数

最后,这是您可以做到的另一种方式,可能最接近您的原始代码,只添加了 3 个字符,应该可以解决所有问题:

class A {
    int a;

    A( int inputA ) { a = inputA; }
};

class B {
    A objectA(0);

    B( A inputObjectA ) { objectA = inputObjectA; }
};
于 2013-11-10T05:30:53.823 回答
0

只需将A()'s 参数传递给B(). 此解决方案适用于A既不是默认可构造的,也不是复制或移动可构造/可分配的。

class A 
{
    int a;

    // Just to demonstrate non copy-move-ness (can be removed)
    A() = delete;
    A( A& ) = delete;
    A( A&& ) = delete;
    A& operator=( A& ) = delete;
    A& operator=( A&& ) = delete;
public:
    A( int inputA ): a(inputA ) {}
};

class B 
{
    A objectA;
public:
    B( int inputA ): objectA(inputA ) { }
};


int main() 
{
    B(42);
}

证明

提示:不要在构造函数主体中使用赋值,而是使用构造函数初始化列表。

您可以从任何现代 C++ 书籍中获得所有这些信息。

于 2013-11-10T06:19:41.590 回答
-1

您需要一个默认构造函数,因为您在类 B 中有一个类 A 的实例。如果您阅读了一些关于调用构造函数的顺序的内容,您会注意到首先为成员调用默认构造函数,然后是主构造函数。类构造函数。所以 - 在你的例子中 - 首先编译器尝试objectA使用默认值进行初始化,但它失败了,因为没有默认构造函数。

于 2013-11-10T05:40:13.333 回答