首页 > 解决方案 > 将一个类传递给另一个类的构造函数时,C++没有默认构造函数错误

问题描述

我正在编写一些 C++ 类,其中一个类具有另一个类的实例作为属性。在编写类构造函数时,我不断收到错误“Foo 类不存在默认构造函数”。这是一个重现错误的小示例:

class Foo {
    int size;
    char name;
    Foo(int s,char n) {
        size = s;
        name = n;
    }
};

class Bar {
    int size;
    char name;
    Foo foo;
    Bar(int s, char n,Foo f){
        size = s;
        name = n;
        foo = f;
    }
};

如果我删除 Foo 的类构造函数以便使用默认构造函数,则错误消失。由于我将 Foo 类的现有实例传递给 Bar 的构造函数,因此我不明白为什么错误会谈论 Foo 的构造函数。为什么会发生错误?以及如何修复代码?

标签: c++constructor

解决方案


您应该通过初始化列表进行初始化,而不是通过赋值。

// You probably want these to be a struct, not class.
// This way all members are public by default.
struct Foo {
    int size;
    char name;

    Foo(int s,char n) : size{s}, name{n} {}
};

struct Bar {
    int size;
    char name;
    Foo foo;

    Bar(int s, char n, const Foo &f) : size{s}, name{n}, foo{f} {}
};

当您不在初始化列表中初始化成员变量时,这与默认构造它然后重新分配值相同。所以你无缘无故地做了两倍的工作。(另见构造函数和成员初始化列表

因为您已经为您的结构定义了一个构造函数,所以默认构造函数被隐式删除,这导致了您的编译错误。

附带说明一下,您甚至可能不需要这些构造函数,而是可以使用聚合初始化,如下所示:

struct Foo {
    int size;
    char name;
};

void example() {
    Foo foo = {1, 'a'}; // the = is optional
}

推荐阅读