возникли проблемы с пониманием того, как связывать объекты в цепочку при реализации других классов

#c

Вопрос:

У меня ошибка компилятора при попытке добавить каждую карту(масть и ранг) в карту объекта.

Вот Card.h файл:

 #define CARD_H
#include <iostream>

using namespace std;

class Card{

    private:
        int rank;
        int suit;
        
    public:
    // must have constructors, destructor, accessor methods, and mutator methods
    Card();
    Card(int, int);
    ~Card();
    
    int get_rank();
    int get_suit();
    
    void set_rank(int);
    void set_suit(int);
    string fillrank(int) ;
    string fillsuit(int) ;
    void printcards();
    /*
    string getr_ank();
    string gets_uit();
    void setr_ank(string);
    void sets_uit(string);
    */

};

#endif
 

Card.cpp

 #include <iostream>
#include "card.h"
#include <string>

using namespace std;

Card::Card(){

    rank = 0;
    suit = 0;

}

Card::Card(int r, int s){

    rank = r;
    suit = s;
    //cout << "Parameterized constructor" << endl;

}

int Card::get_rank(){

    return rank;

}

int Card::get_suit(){

    return suit;

}

void Card::set_rank(int rank){

    this->rank = rank;

}

void Card::set_suit(int suit){

    this->suit = suit;

}

string Card::fillrank(int rank) {

switch(rank){
        case 0:
            return "Ace";
                break;
        case 1:
            return "2";
                break;
        case 2:
            return "3";
                break;
        case 3:
            return "4";
                break;
        case 4:
            return "5";
                break;
        case 5:
            return "6";
                break;
        case 6:
            return "7";
                break;
        case 7:
            return "8";
                break;
        case 8:
            return "9";
                break;
        case 9:
            return "10";
                break;
        case 10:
            return "Jack (J)";
                break;
        case 11:
            return "Queen (Q)";
                break;
        case 12:
            return "King (K)";
                break;
    }

}

string Card::fillsuit(int suit) {

    switch(suit){

        case 0:
            return "Clubs";
                break;
        case 1:
            return "Spades";
                break;
        case 2:
            return "Hearts";
                break;
        case 3:
            return "Diamonds";
                break;

    }
}

void Card::printcards(){

cout << rank << " of " << suit << endl;

}

Card::~Card(){
 cout << "Destructor called!" << endl;
 

deck.h

 #ifndef DECK_H
#define DECK_H
#include "card.h"

class Deck{
    private:
        Card cards[52];
        int n_cards; //Number of cards remaining in the deck.
    public:
        //must have constructors, destructor, accessor methods, and mutator methods.

    Deck();
    

    int get_cards();

    void set_cards(int);
    void filldeck();
    void printdeck();
    ~Deck();


};

#endif
 

deck.cpp

 #include <iostream>
#include "deck.h"
#include <string>

using namespace std;

Deck::Deck(){

    n_cards = 0;

}

int Deck::get_cards(){

    return n_cards;
}

void Deck::set_cards(int cards){

    n_cards = cards;

}

void Deck::filldeck(){

    int a = 0;
    Card p1;
    for (int x = 0; x <13 ;x  ){
        for(int y = 0; y < 4; y  ){
            cards[a] = p1.fillrank(x);
            cards[a] =  p1.fillsuit(y) ;

            a  ;
        }
    }

}

void Deck::printdeck(){

    for (int i = 0; i < 52; i  ){
        cards[i].printcards();
    }

}

Deck::~Deck(){


}
 

This is the error I'm getting:

 deck.cpp:52:22: error: no match for ‘operator=’ (operand types are ‘Card’ and ‘std::string {aka std::basic_string<char>}’)
             cards[a] = p1.fillrank(x);
ard.h:7:7: note: Cardamp; Card::operator=(const Cardamp;)
 class Card{
       ^
card.h:7:7: note:   no known conversion for argument 1 from ‘std::string {aka std::basic_string<char>}’ to ‘const Cardamp;’
deck.cpp:53:22: error: no match for ‘operator=’ (operand types are ‘Card’ and ‘std::string {aka std::basic_string<char>}’)
             cards[a] =  p1.fillsuit(y) ;
 

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

Комментарии:

1. Поп-тест: что fillrank() возвращает ваш метод? Какие значения хранятся в card[] массиве? Можете ли вы назначить одно другому (ответ, конечно, отрицательный, это то, что говорит вам ваш компилятор C , но ответы на первые два вопроса укажут вам на причину).

Ответ №1:

Здесь происходит то, что ваш fillrank и fillsuit на самом деле не заполняет ранг и масть этой карты, вместо этого он возвращает ранг и масть, которыми она должна быть заполнена.

Чтобы на самом деле заполнить ранг, вам нужно сделать что-то подобное rank = "Ace" в этой функции.

Таким образом, вы бы изменили свою функцию на что-то вроде:

 void fillrank(int rank)
{
    switch(rank)
    {
        case 0:
            this.rank = "Ace";
            break;
        case 1:
            this.rank = "2";
            break;
        case 2:
            .
            .
            .
    }
}
 

И в вашей filldeck функции вы можете просто вызвать каждую карту из колоды и применить fillrank ее непосредственно, например:

 cards[a].fillrank(x);
 

Комментарии:

1. В этом есть смысл. Я ценю вашу помощь!