2016-04-28 2 views
-2

Даже я пробовал много, но я не знаю, где ошибка в моем коде. Кажется, это так просто.Ошибка: нет подходящего конструктора по умолчанию

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

ответ

0

Ваш класс не имеет default constructor. Это не проблема сама по себе. Однако, если вы попытаетесь вызвать несуществующий default constructor, будет показана ошибка. Вы, вероятно, делать что-то подобное в другом месте (одна из этих линий достаточно, чтобы бросить эту ошибку):

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

решение?

Если вы действительно не хотите, чтобы Card выделялся без предоставления аргументов, вы не должны этого делать. Найдите код, который пытается выделить объект Card и измените его. КСТАТИ предпочтительно 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

Мне нравится этот ответ, но: кто знает, поможет ли это решению проблемы ОП, поскольку не достаточно была предоставлена ​​информация (независимо, ваш ответ полезен), и я считаю, что было бы неплохо упомянуть _why_ конструктор по умолчанию не был создан – Tas

0

Вы определили ваш собственный конструктор, в таких случаях компилятор не добавляет конструктор по умолчанию. В дальнейшем, если вы пытаетесь создать объект, как указано ниже, вы будете в конечном итоге без ошибок конструктора по умолчанию

card obj; // Ошибка

решение:

1) передавать аргументы, при создании объект (Most appropriate в соответствии с фрагментом текста):

пример:

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

2) Определение кон по умолчанию structor:

class Card 
{ 
    private: 
     Suit suit_; 
     Symbol symbol_; 

    public: 
     Card(){}; 

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

}; 
0

Чтобы сократить его, просто и просто предоставить конструктор по умолчанию (без аргументов).

Card() 
{ 
} 

Причина, по которой требуется конструктор по умолчанию, заключается в том, что вы используете вектор (контейнер) этого типа. (класс). и для классов контейнеров содержащийся класс (карта) должен иметь конструктор по умолчанию.

Смежные вопросы