mardi 3 décembre 2019

Accessing functions of inherited class from base class vector - C++11

I have two types of a custom Player class, botPlayer and humanPlayer. I create a vector of the base class Player, and when using functions that are defined in the Player class, the code runs fine.

Code is below:

Player.h

class Player
{
    public:
    explicit Player(string name){
        this->name = name;
        this->balance = 100;
    } 

    Player() { };

    /**

    A bunch of funtions. Removing for minimal code sample.
    NO FUNCTION CALLED void tradeCards(vector<Card> &deck)

    **/

    protected:
    int balance;
    Hand playerHand;
    string name;

}; 


class botPlayer : public Player
{ 
    public:
    explicit botPlayer(string name){
        this->name = name;
        this->balance = 100;
    }

    int decide(){        
        return rand() % 2;
    } 

    void tradeCards(vector<Card> &deck){
        int decision = decide();
        if(decision == 1){
            int trades = rand() % 3 + 1;            
            cout << "Decided to trade " << trades << " cards" << endl;

            for (unsigned int i = 0; i < trades; i++){ 
                playerHand.addCardToHand(deck[i], i);
                deck.erase(deck.begin() + i);
            } 

        }else{
            cout << "Decided not to trade cards" << endl;
        } 
    } 
}; 


class humanPlayer : public Player
{
    public:
    explicit humanPlayer(string name){
        this->name = name;
        this->balance = 100;
    } 

    void tradeCards(vector<Card> &deck){
        string input;
        vector<int> trades;
        int curr;

        cout << "Please enter the indices you want to switch cards for. If you don't want a switch, simply type x" << endl;
        cin >> input;

        for(char& c : input){           
            if(c == 'x'){
                return;
            }else{
                curr = (int)c - 48;
                trades.push_back(curr);
            } 
        } 

        for (unsigned int i = 0; i < trades.size(); i++){ 
            playerHand.addCardToHand(deck[i], trades[i]);
            deck.erase(deck.begin() + i);
        } 
    } 

}; 

Main.cpp

/** Include a bunch of stuff **/
using namespace std;

int main(){
    srand(time(NULL));
    int ante = 50;
    int pool = 0;

    Deck myDeck;
    vector<Card> theDeck = myDeck.getDeck();
    myDeck.shuffleDeck(theDeck);

    humanPlayer playerOne("tony");
    botPlayer playerTwo("comp");

    vector<Player> players;
    players.push_back(playerOne);
    players.push_back(playerTwo);


    while(players.size() > 1){
        Hand bestHand = players[0].getHand();
        checkPlayers(players);
        for(unsigned int i = 0; i < players.size(); i++){
            cout << "My name is: " << players[i].getName() << " and my balance is: " << players[i].getBalance() << endl;
            players[i].fillHand(theDeck);
            players[i].placeBet(ante, pool); 

            cout << " My current hand is: " << endl;
            players[i].getHand().printHand();
            cout << "\n" << endl;

            players[i].tradeCards(theDeck);
            //curr.getHand().printHand();
            //cout << "\n" << endl;
        } //end for
    } //end while

    cout << players[0].getName() << " wins! " << endl;
    return 0;

} //end main

However, when using functions defined in the subclasses, I get an error:

Testing.cpp:43:24: error: '__gnu_cxx::__alloc_traits<std::allocator<Player>, Player>::value_type' {aka 'class Player'} has no member named 'tradeCards'
   43 |             players[i].tradeCards(theDeck);

I tried adding in a blank function call in the Player class, like so:

void tradeCards(vector<Card> &deck){ };

The code then compiled, but produced incorrect results (i.e., the cards were not traded).

How can I access the specific inherited class' member functions? Isn't this supposed to be accomplished by polymorphism?

Aucun commentaire:

Enregistrer un commentaire