繁体   English   中英

错误:没有合适的默认构造函数可用

[英]Error: no appropriate default constructor available

即使我已经尝试了很多,但我不知道我的代码中的错误在哪里。 看起来就这么简单。

enum Suit { none, clubs, diamonds, hearts, spades };
enum Symbol { none_, ace, king, queen, jack, ten, nine, eight, seven };

class Card
{
private:
    Suit suit_;
    Symbol symbol_;

public:

    Card(Suit suit, Symbol symbol)
    {
        suit_=suit;
        symbol_=symbol;
    };

您的类没有default constructor 这本身不是问题。 但是,如果您尝试调用不存在的default constructor ,则会显示错误。 你可能在其他地方做这样的事情(其中一行足以引发该错误):

Card x;
std::vector<Card> v(3);
auto x=std::make_shared<Card>();
//...and many others...

解决方案?

如果您真的不希望在没有给出参数的情况下分配Card ,则不应这样做。 找到尝试分配Card对象并更改它的代码。 顺便说一句,最好在像这样的明确声明中delete default constructor

class Card{
private:
    Suit suit_;
    Symbol symbol_;
public:
    Card()=delete;
    Card(Suit suit, Symbol symbol)
    {
        suit_=suit;
        symbol_=symbol;
    }
};

如果您可以使用默认值从Card类分配对象,请添加以下内容:

class Card{
private:
    Suit suit_;
    Symbol symbol_;
public:
    Card()=default;
    //Or Card():suit_(some_value),symbol_(somevalue){}
    Card(Suit suit, Symbol symbol)
    {
        suit_=suit;
        symbol_=symbol;
    }
};

您已经定义了自己的构造函数,在这种情况下,编译器不会添加默认构造函数。 今后,如果您尝试创建如下所述的对象,您最终将不会遇到默认构造函数错误

card obj; // 错误

解决方案:

1)在创建对象时传递参数( Most appropriate根据片段):

例子:

Suit suitenum = clubs;  
Symbol symnum = king;
Card obj(suitenum,symnum);

2)定义一个默认构造函数:

class Card
{
    private:
        Suit suit_;
        Symbol symbol_;

    public:
        Card(){};

        Card(Suit suit, Symbol symbol)
        {
            suit_=suit;
            symbol_=symbol;
        };

};  

简而言之,您只需要提供默认构造函数(无参数)即可。

Card()
{
}

您需要默认构造函数的原因是您正在使用这种类型的向量(容器)。 (班级)。 对于容器类,所包含的类(卡片)必须具有默认构造函数。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM