Inheritance 向量的C++继承 我在C++中继承了一个问题。

Inheritance 向量的C++继承 我在C++中继承了一个问题。,inheritance,vector,c++-cli,Inheritance,Vector,C++ Cli,我有一个deckOfCards对象,我正试图从中继承向量。我这样做是因为我希望deckOfCards对象本身是一个集合 唯一的问题是代码不允许我使用this关键字添加对象,除非我从vector card*而不是vector card继承 以下是deckOfCards的分类代码: #include "stdafx.h" #include <vector> #include <typeinfo> #include <iostream> //#include "Ca

我有一个deckOfCards对象,我正试图从中继承向量。我这样做是因为我希望deckOfCards对象本身是一个集合

唯一的问题是代码不允许我使用this关键字添加对象,除非我从vector card*而不是vector card继承

以下是deckOfCards的分类代码:

#include "stdafx.h"
#include <vector>
#include <typeinfo>
#include <iostream>
//#include "Card.cpp"

using namespace System;
using namespace System::Collections::Generic;
using namespace std;

/// <summary>
/// Deck of cards class
/// </summary>
/// 
/// 
/// 
public enum deckTypeEnum { Full = 1 };
public enum cardSuit { Hearts = 1, Diamonds = 2, Clubs = 3, Spades = 4 };
public enum cardRank { Ace = 1, Two = 2, Three = 3, Four = 4, Five = 5, Six = 6, Seven = 7, Eight = 8, Nine = 9, Ten = 10, Jack = 11, Queen = 12, King = 13 };


public class Card
{
    public: Card(cardSuit suit, cardRank rank)
    {
        CardSuit = suit;
        CardRank = rank;
}

    public: cardSuit CardSuit;
    public: cardRank CardRank;
};

public class DeckOfCards: public vector<Card*>
{
    public:DeckOfCards::DeckOfCards(deckTypeEnum deckType)
    {
        InitCardDeck(deckType);
    }

    public: void InitCardDeck(deckTypeEnum deckType)
    {
    this->push_back(new Card(Hearts, Four));
    switch (deckType)
        {
            case 1:
                CardCount = 52;
                GetFullCardDeck();
                break;
            default:
                CardCount = 52;
                GetFullCardDeck();
                break;
        }
}

    public: void GetFullCardDeck()
    {
        for (int i=0; i<Spades; i++)
        {
            for (int g=0; g<King; g++)
            {
            this->push_back(new Card((cardSuit)i, (cardRank)g));
            }
        }
    }

   public: void Shuffle()
   {
        Random^ rand = gcnew Random();
        for (int i = CardCount - 1; i > 0; i--)
        {
            int n = rand->Next(i + 1);
        Card *temp = this->at(i);
            this->at(i) = this->at(n);
            this->at(n) = temp;
        }
    }

    public: int CardCount;
    //   public: vector<Card> deckocards1;
//deckocards1[1];
};
一个简单的解决办法是让玩家的牌是矢量牌,而不是矢量牌*。

之所以Player.Hand必须是vector Card而不是vector Card*类型,是因为我需要对集合中的每个项执行一个switch语句,如果是vector Card*,我得到的错误表达式必须具有类类型

public: int GetScore(vector<Card> cardHand)
{
    int score = 0;

    for (int i=0;i<cardHand.size();i++)
    {
        switch (cardHand[i].CardRank)
        {
            case King:
                score += 10;
                break;
            case Queen:
                score += 10;
                break;
            case Jack:
                score += 10;
                break;
            //Considering an Ace is equal to one, it doesn't mention it in the instructions.
            default:
                score += (int)cardHand[i].CardRank;
                break;
        }
    }

    return score;
}
编辑

为了简化问题,我的问题是:

我得到一个错误,表示表达式必须在CardHand对象上具有类类型

public: int GetScore(vector<Card*> cardHand)
{
    int score = 0;

    for (int i=0;i<cardHand.size();i++)
    {
        switch (cardHand.CardRank)
        {
            case King:
                score += 10;
                break;
            case Queen:
                score += 10;
                break;
            case Jack:
                score += 10;
                break;
            //Considering an Ace is equal to one, it doesn't mention it in the instructions.
            default:
                score += (int)cardHand[i].CardRank;
                break;
        }
    }

    return score;
}

我最终能够继承法向量

问题在于这一行代码:

this->push_back(new Card((cardSuit)i, (cardRank)g));
我最终做了这样的事:

Card blah = Card((cardSuit)i, (cardRank)g);
this->push_back(blah);

一旦我能够从vector而不是vector继承,我就可以做我需要的事情了。

从设计的角度看,我想你已经有点偏离了。您是否考虑过将其设计为DeckOfCards包含std::vector而不是从std::vector继承?另外,你不使用直C++,你使用^和GCNEXT点到微软C++ + cli.ya,但我认为它是从向量卡继承的分类答案,因为DekFoCK毕竟是一个集合。标准库容器不是设计用来作为基类的。例如,它们没有虚拟析构函数。@fonZ否,标记不正确。它不是C++,至少第一个代码示例不是。将GetScore更改为:int GetScorevector&cardHand;因为将其作为引用传递要高效得多。最后,将开关更改为:switch cardHand[i]->CardRank,当然要确保它不为null。
Card blah = Card((cardSuit)i, (cardRank)g);
this->push_back(blah);