C++ 抽象类,继承类和函数写入单独的向量c++;

C++ 抽象类,继承类和函数写入单独的向量c++;,c++,inheritance,vector,virtual,abstract,C++,Inheritance,Vector,Virtual,Abstract,纸牌游戏;我正在使用抽象类来表示“手”牌。“手”需要稍有不同,但它们共享大部分功能。因此,有一只手和一只大师手,它们将继承自手,并具有额外的功能。所有的东西都经过发牌的牌组。我的目标是在Hand类中以一种允许将被调用的抽象类的实例写入handV的方式来构造函数,而不管它是MasterHand的。。我尝试过不同的方法,但都不管用 class AbstractClass { virtual ~AbstractClass(){} virtual void getCard

纸牌游戏;我正在使用抽象类来表示“手”牌。“手”需要稍有不同,但它们共享大部分功能。因此,有一只手和一只大师手,它们将继承自手,并具有额外的功能。所有的东西都经过发牌的牌组。我的目标是在Hand类中以一种允许将被调用的抽象类的实例写入handV的方式来构造函数,而不管它是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
}
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;
}