Сообщение об ошибке «Конструктор по умолчанию не может быть указан» - является ли использование конструктора по умолчанию обязательным в моем случае? (Обучение OOP) - PullRequest
0 голосов
/ 02 мая 2020
#include <iostream>
#include <array>
#include <algorithm>
#include <cstdlib>
#include <ctime>
#include <random>
#include <iterator>
#include <string>

class Deck;

class Card
{
public:
    enum cRanks
    {
        RANK_2,
        RANK_3,
        RANK_4,
        RANK_5,
        RANK_6,
        RANK_7,
        RANK_8,
        RANK_9,
        RANK_10,
        RANK_J,
        RANK_Q,
        RANK_K,
        RANK_A,

        MAX_RANKS,
        RANK_AIR
    };

    enum cSuits
    {
        SUIT_CLUBS,
        SUIT_DIAMONDS,
        SUIT_HEARTS,
        SUIT_SPADES,

        MAX_SUITS,
        SUIT_AIR
    };

private:
    cRanks m_rank{RANK_A};
    cSuits m_suit{SUIT_SPADES};

public:
    //Card() = default;

    Card(cRanks r, cSuits s)
        :m_rank{ r }, m_suit{ s }
    {
    }

    void print() const
    {
        char rank{};
        char suit{};
        switch (m_rank)
        {
            case(RANK_2): rank = '2'; break;
            case(RANK_3): rank = '3'; break;
            case(RANK_4): rank = '4'; break;
            case(RANK_5): rank = '5'; break;
            case(RANK_6): rank = '6'; break;
            case(RANK_7): rank = '7'; break;
            case(RANK_8): rank = '8'; break;
            case(RANK_9): rank = '9'; break;
            case(RANK_10): rank = 't'; break;
            case(RANK_J): rank = 'J'; break;
            case(RANK_Q): rank = 'Q'; break;
            case(RANK_K): rank = 'K'; break;
            case(RANK_A): rank = 'A'; break;
            case(RANK_AIR): rank = '_'; break;
            default: rank = '?';
        }
        switch (m_suit)
        {
            case(SUIT_CLUBS): suit = 'C'; break;
            case(SUIT_DIAMONDS): suit = 'D'; break;
            case(SUIT_HEARTS): suit = 'H'; break;
            case(SUIT_SPADES): suit = 'S'; break;
            case(SUIT_AIR): suit = '_'; break;
            default: suit = '?';
        }
        std::cout << rank << suit << ' ';
    }

    friend Deck; 
};

class Deck
{
public:
    using array_type = std::array<Card, 52>;
    using index_type = int;
private:
    array_type m_deck;
    index_type m_index{ 0 };

public:
    Deck()
    {
        m_index = 0;
        int index{0};
        for (int s{ 0 }; s < Card::MAX_SUITS; ++s)
        {
            for (int r{ 0 }; r < Card::MAX_RANKS; ++r)
            {
                m_deck[index].m_rank = static_cast<Card::cRanks>(r);
                m_deck[index].m_suit = static_cast<Card::cSuits>(s);
                index++;
            }
        }
    }

    void print()
    {
        if (m_index > static_cast<int>(m_deck.size()) - 1)
        {
            std::cout << "\nDeck out of cards!";
            return;
        }
        std::cout << '\n';
        for (int i{ m_index }; i < m_deck.size(); ++i)
            m_deck[i].print();
    }

    void shuffle(unsigned int seed = 777)
    {
        std::mt19937 g{ seed };
        std::shuffle(m_deck.begin(), m_deck.end(), g);
    }

    const Card& draw()
    {
        if (m_index > static_cast<int>(m_deck.size()) - 1)
        {
            std::cout << "\nDeck out of cards!";
            return Card(Card::RANK_AIR, Card::SUIT_AIR);
        }
        return m_deck[m_index++];
    }
};

int main()
{
    Deck deck{};
    deck.print();
    deck.shuffle();
    deck.print();



    return 0;
}

Простая игра-упражнение BlackJack для изучения OOP. В приведенном выше коде я получаю сообщение об ошибке «на конструктор по умолчанию нельзя ссылаться - это удаленная функция» в моем конструкторе Deck. Разумно ли предположить, что мой массив m_deck не может быть создан, чтобы конструктор Deck мог присвоить ему значения, потому что класс Card не имеет конструктора по умолчанию? Что, если я хочу, чтобы у моего конструктора Карты по умолчанию были аргументы? Могу ли я избежать использования "Cards () = default;" в моем классе карт? Я думал, что разумно создавать экземпляр объекта Card, только если вы определите его природу (ранг и масть).

1 Ответ

0 голосов
/ 02 мая 2020
  1. Нет рецепта для создания объекта Card () из возвращаемого типа const Card & в отсутствие конструктора копирования; constexpr Card :: Card (const Card &)
  2. Компилятор хотел бы использовать конструктор по умолчанию, предоставленный вами или сгенерированный им, чтобы соответствовать возвращаемому типу Card в std :: array. Следовательно, /usr/include/c++/7/array:94:12: error: no matching function for call to ‘Card::Card()
  3. Я попытался воспроизвести ваш код с минимальными затратами с добавлением Card() = default; Card(const Card& other) = default; Кажется, что он компилируется по крайней мере. Я не могу проверить функциональные аспекты для вас.
#include <iostream>
#include <array>

class Deck;

class Card
{
public:
    enum cRanks
    {
        RANK_A,
        MAX_RANKS,
        RANK_AIR
    };

    enum cSuits
    {
        SUIT_SPADES,
        MAX_SUITS,
        SUIT_AIR
    };
private:
    cRanks m_rank{RANK_A};
    cSuits m_suit{SUIT_SPADES};

public:
    Card() = default;

    Card(const Card& other) = default;

    Card(cRanks r, cSuits s)
        :m_rank{ r }, m_suit{ s }
    {
    }

    void print() const
    {
        char rank{};
        char suit{};
        switch (m_rank)
        {
            case(RANK_A): rank = '_'; break;
            default: rank = '?';
        }
        switch (m_suit)
        {
            case(SUIT_SPADES): suit = 'C'; break;
            default: suit = '?';
        }
        std::cout << rank << suit << ' ';
    }

    friend Deck; 
};

class Deck
{
public:
    using array_type = std::array<Card, 52>;
    using index_type = int;
private:
    array_type m_deck;
    index_type m_index{ 0 };

public:
    Deck()
    {
    }

    void print()
    {
    }

    void shuffle(unsigned int seed = 777)
    {
    }

    const Card& draw()
    {
    }
};

int main()
{
    Deck deck{};
    deck.print();
    deck.shuffle();
    deck.print();



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