【问题标题】:c++ inheritance of vectorc++向量的继承
【发布时间】:2014-06-06 18:29:58
【问题描述】:

我在 C++ 中遇到了继承问题。

我有一个“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];
};

这会在稍后将 5 个对象从“deckOfCards”对象移动到另一个向量 (player.CardHand) 时出现问题。矢量 (player.CardHand) 是“矢量卡片”类型。所以它与“vector Card*”的“deckOfCards”类型不匹配。结果我得到一个错误。

move(deckOfCards.begin(), it, back_inserter(player.CardHand));  // ##

一个简单的解决方法是让 Player.Hand 类型为“vector Card”而不是“vector Card*”。

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;
}

【问题讨论】:

  • 从设计的角度来看,我认为你有点偏离了。您是否考虑过设计它以使DeckOfCards 包含std::vector&lt;Card&gt; 而不是从std::vector&lt;T&gt; 继承?另外 - 您没有使用直接的 C++,您对 ^gcnew 的使用指向 Microsoft 的 C++-CLI。
  • 是的,但我认为这是从矢量 Card 继承的更经典的答案,因为 deckOfCards 毕竟实际上是一个集合。
  • 标准库容器不是为用作基类而设计的。例如,它们没有虚拟析构函数。
  • @fonZ 不,标签不正确。它不是 C++,至少第一个代码示例不是。
  • 让 PlayerHand 使用矢量。将 GetScore 更改为: int GetScore(vector& cardHand);因为将其作为参考传递会更有效。最后,将您的开关更改为: switch (cardHand[i]->CardRank) (当然要确保它不为空)。

标签: inheritance vector c++-cli


【解决方案1】:

我最终能够继承普通的vector&lt;card&gt;


问题是这行代码:

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

我最终这样做了:

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

一旦我能够从 vector&lt;card&gt; 而不是 vector&lt;card*&gt; 继承,我就能够做我需要的事情。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-09-21
    • 2017-09-05
    • 1970-01-01
    • 1970-01-01
    • 2020-08-18
    • 1970-01-01
    • 2015-12-09
    • 2016-04-30
    相关资源
    最近更新 更多