【发布时间】: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<Card>而不是从std::vector<T>继承?另外 - 您没有使用直接的 C++,您对^和gcnew的使用指向 Microsoft 的 C++-CLI。 -
是的,但我认为这是从矢量 Card 继承的更经典的答案,因为 deckOfCards 毕竟实际上是一个集合。
-
标准库容器不是为用作基类而设计的。例如,它们没有虚拟析构函数。
-
@fonZ 不,标签不正确。它不是 C++,至少第一个代码示例不是。
-
让 PlayerHand 使用矢量
。将 GetScore 更改为: int GetScore(vector & cardHand);因为将其作为参考传递会更有效。最后,将您的开关更改为: switch (cardHand[i]->CardRank) (当然要确保它不为空)。
标签: inheritance vector c++-cli