Карточная игра; Я использую абстрактный класс для «рук», которые держат карты. «Руки» должны немного отличаться, но они разделяют большинство функций. Таким образом, есть Рука и MasterHand, которые будут наследовать от Руки и иметь дополнительную функцию. Все идет через колоду, которая раздает карты. Моя цель состоит в том, чтобы сформулировать функцию в классе Hand таким способом, который позволяет записывать в handV экземпляр класса Abstract, который вызывается, независимо от того, является ли он Hand of MasterHand. Я пробовал разные методы, но не смог сделать любой из них работает.
class AbstractClass
{
virtual ~AbstractClass(){}
virtual void getCard(Card::card)=0 ;
};
class Hand:public AbstractClass
{
public:
vector<Card::card> handV;
virtual void getCard(Card::card k) override
{
writeIntoVector(k);
}
void writeIntoArray(Card::card g)
{
handV.push_back(g);
}
};
class HandMaster:public Hand
{
public:
vector<Card::card> handV;
// now here I would like to use the functions from Hand, but make them write into HandMaster.handV rather than Hand.handV
};
class Deck
{
void passCard(AbstractBase &x)
{
x.getCard(deck.back());
}
};
int main
{
AbstractBase* k=&h;
Hand* p = static_cast<Hand*>(k); // so I was trying to do it via casting in different convoluted ways but failed
MasterHand h2;
AbstractBase* m=&h2;
d.passCard(*k); // here I'd like the card to be passed to Hand.handV
d.passCard(*m); // here I'd like the card to be passed to MasterHand.handV
}
Я добавил и упростил часть кода. Но я укажу вам некоторые ресурсы по полиморфизму, чтобы вы начали. Я также полностью удаляю AbstractClass, так как с точки зрения ООП у вас есть объекты, которые являются руками, и другой объект главной руки.
https://www.tutorialspoint.com/cplusplus/cpp_polymorphism.htm
#include <vector>
#include <iostream>
//dummy class
struct Card{
int x;
};
class Hand{
public:
Hand(){}
std::vector<Card> handV;
virtual ~Hand(){}
virtual void getCard(Card k)
{
handV.push_back(k);
}
virtual void showHand()
{
for(std::vector<Card>::const_iterator it = handV.begin();
it != handV.end();
it++)
std::cout << it->x << " ";
}
};
class HandMaster: public Hand
{
public:
HandMaster(){}
//add additional methods
};
class HandOther: public Hand
{
public:
HandOther(){}
//add additional methods
};
class Deck
{
public:
std::vector<Card> deck;
Deck(){
Card c;
for(int i = 1; i <= 52; ++i){
c.x = i;
deck.push_back(c);
}
}
void passCard(Hand *x)
{
x->getCard(deck.back());
deck.pop_back();
}
};
int main()
{
Deck d;
Hand* p = new Hand();
HandMaster *m = new HandMaster();
HandOther * o = new HandOther();
for(int i =0; i < 5; ++i){
d.passCard(p);
d.passCard(m);
d.passCard(o);
}
std::cout << "\nHand:";
p->showHand();
std::cout << "\nHandMaster:";
m->showHand();
std::cout << "\nHandOther:";
o->showHand();
std::cout << "\n";
delete o;
delete p;
delete m;
}
Других решений пока нет …