Используйте объект в функции класса

0

Я новичок в C++, и у меня возникают проблемы с попыткой использовать один объект класса в другой функции класса. Например, если у меня есть:

#ifndef CARD_HPP
#define CARD_HPP
#include <string>

enum Suits
{
SPADES,
CLUBS,
HEARTS,
DIAMONDS
};

enum Values
{
TWO,
THREE,
FOUR,
FIVE,
SIX,
SEVEN,
EIGHT,
NINE,
TEN,
JACK,
QUEEN,
KING,
ACE
};


class Card
{
public:
    Card(Values value, Suits suit);
    Values getValue() const;
    Suits getSuit() const;
    void showCard();
    std::string toString(Values v);
    std::string toString(Suits s);

private:
    Suits suit;
    Values value;

};

а также:

#ifndef DECK_OF_CARDS_HPP
#define DECK_OF_CARDS_HPP

#include "card.hpp"
#include <vector>
#include <string>

Values enumValueOfIndex(int i);
Suits enumSuitOfIndex(int i);

class DeckOfCards
{
public:
    DeckOfCards();
    void shuffleDeck();
    void printDeck();
    Card drawCard();

private:
    const std::string suit_strings[4];
    const std::string value_strings[13];
    unsigned seed;
    Values values;
    Suits suits;
    std::string suit;
    std::string value;
    std::vector<Card> deck;
};

#endif

У меня ошибка, когда в моей Deck::printDeck() при попытке сделать:

Card card = deck.at(i); //I have already added 52 card objects to deck

Ошибка, которую я получаю:

error: non-object type 'Card (Values, Suits)' is not assignable
    card = deck.at(i);

Я использую старый Java-код, чтобы сделать это, и это по существу то, что я сделал. Я не знаю, нужно ли мне определять/объявлять объект Card в заголовке/источнике Deck или даже как это сделать. Я чувствую, что это простая проблема, но я не могу найти для нее никакого решения. Спасибо за любую помощь!

  • 0
    at возвращает ссылку на объект, но это не должно быть проблемой, вероятно, нет конструктора копирования, определенного правильно
  • 0
    Я думаю, что нам нужно увидеть больше объявлений класса вашей Card . Каковы ваши переменные-члены? Любые const или ссылки члены переменных? Любые `= delete` функции-члены? Наследование от boost::noncopyable или что-то?
Показать ещё 4 комментария
Теги:

2 ответа

1

Похоже, вам нужно определить конструктор копирования и оператор присваивания, попробуйте добавить:

Card(const Card& rhs);
Card& operator=(const Card& rhs);
  • 1
    Хотя они должны быть предоставлены компилятором, если они явно не отключены. Правильно?
  • 0
    возможно, есть больше кода, и он не был вставлен
Показать ещё 6 комментариев
0

Определение конструктора присваивания копий для вашего класса приведет к тому, что оператор = (оператор присваивания) будет запущен в вашей программе.

Card( const Card & input );

Если вы хотите присвоить специальное значение для оператора =, вы должны переопределить его. Ниже вы можете найти некоторые ресурсы, которые помогут вам:

  • C++ Книга Primer 5th Edition. Глава 7.1.5 поможет вам понять специальные функции класса
  • Здесь вы найдете другие ссылки, которые бесплатны.
  • Здесь вы узнаете больше о перегрузке оператора.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню