error: use of deleted function 'Hund4::Hund4()'

error: use of deleted function 'Hund4::Hund4()'

我是 C++ 的新手。我写这段代码是为了理解 publicprotectedprivate 之间的区别。问题是,当我创建 Hund4 的对象时,出现此错误:

use of deleted function

这个错误在最后一行。

你能帮我解决这个问题吗?

#include <iostream>
#include <iostream>
#include <string>
using namespace std;

class Tier
{
public:
    void wieMachtDasTier()
    {
        cout << "Hello\n";
    }

protected:
    void foo()
    {
        cout << "foo\n";
    }

private:
    void baz()
    {
        cout << "baz\n";
    }
};

class Hund: public Tier
{
private:
    string name;

public:
    Hund(string newname):name(newname){}

    string getname()
    {
        return this->name;
    }

    void test()
    {
        foo();
    }
};

class Hund2: protected Tier
{
public:
    void test()
    {
        foo();
    }
};

class Hund3: private Tier
{
public:
    void test()
    {
        foo();
    }
};

class Hund4 : public Hund
{

};

int main()
{
    Hund ace("ace");
    ace.wieMachtDasTier();
    Tier Haustier;
    ace.test();
    Hund2 ace2;
    ace2.test();
    Hund3 ace3;
    ace3.test();
    Hund4 ace4;
    return 0;
}

Hund4派生的Hundclass没有默认构造函数,所以Hund4没有默认构造函数。您可以从 std::stringHund 构建 Hund4,但是:

Hund4 ace4(std::string{"ace4"});
Hund4 ace4(Hund{"ace4"});

using std::literals;
Hund4 ace("Waldi"s);

出于某种原因,其他人请解释为什么 const char *Hund 足够,但对 Hund4 不起作用。

或者,你必须给Hund4一个构造函数:

class Hund4 : public Hund
{
  public:
    Hund4(string newname) : Hund(newname) { }
};

Hund4 ace4("ace4");

Tier 没有 user-declared 构造函数,而 std::string 是 default-constructable,所以 Tier 有一个compiler-generated 默认构造函数。

Hund2Hund3 派生自 Tier,没有 user-declared 构造函数,也没有任何非default-constructable 数据成员,因此它们也有 compiler-generated 个默认构造函数。

另一方面,

Hund 有一个 user-declared 构造函数,因此它没有 compiler-generated默认构造函数。

Hund4 没有 user-declared 构造函数,但是 Hund 不是 default-constructable,所以 Hund4 有没有 compiler-generated 默认构造函数。

因此,如果您希望 Hund4 成为 default-constructable,您需要:

  • 制作Hunddefault-constructable,eg:

    class Hund: public Tier
    {
    private:
        string name;
    
    public:
        Hund() {}
        Hund(string newname) : name(newname) {}
    
        // or:
        // Hund(string newname = "") : name(newname) {}
    
        ...
    };
    
  • Hund4它自己的user-declared默认构造函数,调用Hund的non-default构造函数,例如:

    class Hund4 : public Hund
    {
    public:
        Hund4() : Hund("") { }
    
        // or:
        // Hund4(string newname = "") : Hund(newname) { }
    };