C++ 抽象类,继承类和函数写入单独的向量c++;
纸牌游戏;我正在使用抽象类来表示“手”牌。“手”需要稍有不同,但它们共享大部分功能。因此,有一只手和一只大师手,它们将继承自手,并具有额外的功能。所有的东西都经过发牌的牌组。我的目标是在Hand类中以一种允许将被调用的抽象类的实例写入handV的方式来构造函数,而不管它是MasterHand的。。我尝试过不同的方法,但都不管用C++ 抽象类,继承类和函数写入单独的向量c++;,c++,inheritance,vector,virtual,abstract,C++,Inheritance,Vector,Virtual,Abstract,纸牌游戏;我正在使用抽象类来表示“手”牌。“手”需要稍有不同,但它们共享大部分功能。因此,有一只手和一只大师手,它们将继承自手,并具有额外的功能。所有的东西都经过发牌的牌组。我的目标是在Hand类中以一种允许将被调用的抽象类的实例写入handV的方式来构造函数,而不管它是MasterHand的。。我尝试过不同的方法,但都不管用 class AbstractClass { virtual ~AbstractClass(){} virtual void getCard
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
}
class抽象类
{
虚拟~AbstractClass(){}
虚拟作废卡片(卡片::卡片)=0;
};
类手:公共抽象类
{
公众:
矢量handV;
虚拟无效getCard(卡::卡k)覆盖
{
写载体(k);
}
无效写入数组(卡::卡g)
{
手推回(g);
}
};
班级服务员:公仆
{
公众:
矢量handV;
//现在我想使用Hand中的函数,但要将它们写入到HandMaster.handV而不是Hand.handV中
};
甲板
{
无效通行证(AbstractBase&x)
{
x、 getCard(deck.back());
}
};
int main
{
AbstractBase*k=&h;
Hand*p=static_cast(k);//所以我试着用不同的复杂方式进行转换,但失败了
大师级h2;
AbstractBase*m=&h2;
d、 passCard(*k);//我想把这张卡传给Hand
d、 passCard(*m);//我想把这张卡传给MasterHand.handV
}
我添加并简化了一些代码。但我将向您介绍一些关于多态性的资源,让您开始学习。我还完全删除了AbstractClass,因为从OOP的角度来看,您的对象是手和另一个主手对象
#包括
#包括
//虚拟类
结构卡{
int x;
};
班主任{
公众:
Hand(){}
std::矢量handV;
虚拟~Hand(){}
虚拟空卡(卡k)
{
手推回(k);
}
虚拟void showHand()
{
对于(std::vector::const_迭代器it=handV.begin();
it!=handV.end();
it++)
std::cout x您缺少Hand和HandMaster之前的类说明符,而且AbstractClass中的析构函数也应该声明为virtual,因此派生类被销毁。还有一件事,如果这是纯抽象类,则将抽象类中的两个虚函数设置为零,就像virtual void getCard(Card::Card)一样=0;这是真的,它不是实际的代码,只是片段组合在一起,在抽象类中得到了析构函数,虚拟的void是纯虚拟的-我现在将进行编辑以澄清,但这并不能解决我的问题..感谢声明所有手动方法虚拟并覆盖使用handmaster Vector的功能不确定如何做到这一点我会写一个解决方案,给我一个分区谢谢你这么快回复我!我同意这是可行的,重写也是我的临时解决方案,但想象一下你有10种不同类型的手,所有的手都有getCard功能(我手上还有六个功能在处理我希望大师继承的handV)-关键是要避免为每个XHand类重写它们,以便它们使用自己的handV-我不确定我是否清楚?如果不清楚,请告诉我!啊,我想我明白了。所以MasterHand的get卡将像Hands一样工作?您可以通过让MasterHand继承hand而不重写任何Hands方法来实现这一点。每个派生的hand类都将包含hand类中定义的handV。将卡片向量移动到基类,并将getCard作为非虚拟函数实现,该函数将调用虚拟函数来选择卡片并将其添加到卡片向量。在派生类中,您只需实现select函数。因此,我的理解是在所有“手”将共享手头声明的handV,而不是拥有单独的handV,这是我之前在测试不同选项时发现的-通过将MasterHand实例化为AbstractClass,然后尝试写入handV,我最终将写入与handV实例相关的handV-但如果您认为它有效,这可能是我的疏忽明天当我的大脑重新开始工作时,我会检查它;)如果你想避免重写完成相同任务的方法,这是一个解决方案!注意@HảiPhạML也提出了另一种方法。如果你想看到其他的选择,请把这个问题打开。我保留了很多细节,但是考虑一下这个链接。它应该对你有帮助。
#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;
}