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

问题描述:

即使我尝试了很多,但我不知道我的代码中的错误在哪里。看起来很简单。错误:没有适当的默认构造函数可用

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

你好。欢迎来到Stack Overflow。请环顾四周,参加[旅游],并通读[帮助中心]。你也可以阅读关于[问]一个很好的问题。 – Sampada

+0

错误说的是什么,它表示哪一行是错误的? – immibis

+0

您的代码不能编译,而不是列出的错误。你确定你复制+粘贴正确吗?如果您需要添加更多信息,您可以[编辑]您的问题 – Tas

您的班级没有default constructor。这本身不是问题。但是,如果您尝试调用不存在的default constructor,则会显示错误。你可能做这样的事情在其他地方(那些线之一,就足以把那个错误):

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

解决方案?

如果你真的不想让Card被分配而没有提供参数,你不应该这样做。找到试图分配Card对象并修改它的代码。 BTW最好是deletedefault 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

我喜欢这个答案,但是:谁知道这是否会解决OP的问题,因为没有足够的提供了信息(不管你的答案是否有用),我觉得提及_why_默认构造函数没有生成会很好 – Tas

您已经定义你自己的构造函数,在这种情况下,编译器不会添加默认的构造函数。从今以后,如果你想为下面提到创建一个对象,你将最终没有默认构造函数的错误

card obj; //错误

解决方案:

1)传递参数,在创建对象(Most appropriate具体根据片断):

例如:

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

2)定义默认CON结构函数:

class Card 
{ 
    private: 
     Suit suit_; 
     Symbol symbol_; 

    public: 
     Card(){}; 

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

}; 

为了简化它,你只需提供默认构造函数(无参数)。

Card() 
{ 
} 

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