Нет соответствующей функции для вызова в конструкторе - C ++ 11 - PullRequest
1 голос
/ 21 сентября 2019

Я пытаюсь создать два класса: один для карты, которая содержит две строки ранга и масти, а другой класс для руки, который содержит массив объектов размера 5.

#include <iostream>
#include <array>
#include <string>

using namespace std;

class Card
{

    public:
    explicit Card(string rank, string suit){
        this->rank = rank;
        this->suit = suit;
    }

    string getRank(){
        return rank;
    }

    string getSuit(){
        return suit;
    }

    protected:
    string rank;
    string suit;

}; 

class Hand
{
    public:
    explicit Hand(Card cards[5]){
        this->cards[5] = cards[5];
    }

    protected:
    Card cards[5];
    bool isFlush;
    bool isStraight;
    bool isRoyal;
    bool isPair;
    bool istwoPair;
    bool isTOAK;
    bool isFOAK;
};

При попытке компиляции я получаю:

wip.cpp:33:35: error: no matching function for call to 'Card::Card()'
   33 |     explicit Hand(Card myCards[5]){
      |                                   ^

Почему конструктор получает ошибку?Я понимаю сообщение No matching function for call to Card::Card(), но я не планирую создавать его пустым образом.Я создам пять карт, а затем назначу пять карт классу.Что-то вроде:

int main(){
    Card card1("3", "Spade");
    Card card2("3", "Spade");
    Card card3("A", "Diamond");
    Card card4("K", "Heart");    
    Card card5("1", "Spade");

    Card hand1cards[5] {card1, card2, card3, card4, card5};

    Hand myHand(hand1cards);    

}

Так что я не планирую перегружать конструктор, так почему я получаю эту ошибку?Что я могу сделать, чтобы исправить мой конструктор, чтобы он позволил мне передать массив объектов Card фиксированного размера для создания объекта Hand?

Я рассмотрел еще несколько вопросов с похожими проблемами, а именно:

Как использовать конструктор не по умолчанию для члена?

ошибка: не найдена соответствующая функция для вызова

"ошибка: нет соответствующей функции для вызова"

И все же ни один из них, похоже, не имеет отношения к моей проблеме (передача массива другого класса этому классу).

1 Ответ

4 голосов
/ 21 сентября 2019

C ++ содержит std::array, который вы включили, но не использовали.Вы можете изменить конструктор следующим образом:

explicit Hand(array<Card, 5> cards) : cards(cards){}

Live on godbolt


Это неправильно:

this->cards[5] = cards[5];

Он обращается к 6-му элементу cards, которого там нет и вызывает неопределенное поведение .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...