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

时间:2016-04-28 05:06:32

标签: c++

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

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;
    };

3 个答案:

答案 0 :(得分:0)

您的班级没有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;
    }
};

答案 1 :(得分:0)

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

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;
        };

};  

答案 2 :(得分:0)

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

Card()
{
}

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