错误:没有适当的默认构造函数可用
即使我尝试了很多,但我不知道我的代码中的错误在哪里。看起来很简单。错误:没有适当的默认构造函数可用
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
对象并修改它的代码。 BTW最好是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;
}
};
我喜欢这个答案,但是:谁知道这是否会解决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(容器)。 (类)。对于容器类,包含的类(卡)必须具有默认构造函数。
你好。欢迎来到Stack Overflow。请环顾四周,参加[旅游],并通读[帮助中心]。你也可以阅读关于[问]一个很好的问题。 – Sampada
错误说的是什么,它表示哪一行是错误的? – immibis
您的代码不能编译,而不是列出的错误。你确定你复制+粘贴正确吗?如果您需要添加更多信息,您可以[编辑]您的问题 – Tas