我将使用Java开发的纸牌游戏应用程序移植到C++,其中卡对象的排名和套装是通用的(为了能够使用多个特定集),并且卡本身也是通用的(可以打包使用扑克牌,塔罗牌等)。如何声明采用模板类参数的模板类
我得到使用的代码块13.12“的代码块,13.12mingw-设置-TDM-GCC-481”
卡编译在经销商类(模板),它的卡对象(另一个模板)错误类(abstract但工具共享功能性的全部卡片必须具有)
#ifndef CARD_H
#define CARD_H
#include <iostream>
#include <fstream>
#include <cassert>
using namespace std;
enum BJRank
{
Ace,
Two,
Three,
Four,
Five,
Six,
Seven,
Eight,
Nine,
Ten,
Jack,
Queen,
King,
END_OF_RANKS
};
enum GenericSuit
{
Clubs,
Diamonds,
Hearts,
Spades,
END_OF_SUITS
};
template <class U, class V>
class Card {
private:
U itsRank;
V itsSuit;
protected:
Card(U newRank = Jack, V newSuit = Spades):
itsRank(newRank), itsSuit(newSuit)
{
//s_numberPlayers++;
//cout<<"Number of cards available is: " << s_numberPlayers << "\n";
ofstream myfile ("C:/Temp/cardLogFile.txt", ios::app);
if (myfile.is_open())
{
myfile << "Card base object constructed\n";
}
}
public:
virtual ~Card()
{
ofstream myfile ("C:/Temp/cardLogFile.txt", ios::app);
if (myfile.is_open())
{
myfile << "Card base object destroyed\n";
myfile.close();
}
// if (s_numberPlayers > 0)
// s_numberPlayers--;
// cout<<"Number of cards available is: " << s_numberPlayers << "\n";
}
virtual void setRank(U newRank)
{
this->itsRank = newRank;
}
virtual void setSuit(V newSuit)
{
this->itsSuit = newSuit;
}
virtual const U getRank()
{
return this->itsRank;
}
virtual const V getSuit()
{
return this->itsSuit;
}
};
#endif
一卡派生类(扑克牌)
#ifndef POKERCARD_H
#define POKERCARD_H
#include "Card.h"
template <class U, class V>
class PokerCard : virtual public Card <U, V> {
public:
PokerCard(): Card <U, V>() {}
PokerCard(U newRank, V newSuit): Card <U, V>(newRank, newSuit) {}
~PokerCard() {}
protected:
virtual void setRank(U newRank)
{
Card <U, V> ::setRank(newRank);
}
virtual void setSuit(V newSuit)
{
Card <U, V> ::setSuit(newSuit);
}
virtual const U getRank()
{
Card <U, V> ::getRank();
}
virtual const V getSuit()
{
Card <U, V> ::getSuit();
}
const int getValue(){return 1;}
};
#endif // POKERCARD_H
的经销商抽象类(从中众议院和玩家将获得)
#ifndef DEALER_H
#define DEALER_H
#include <fstream>
#include <cassert>
#include <vector>
#include "PokerCard.h"
#include "TarotCard.h"
template < template <class U, class V> class T>
class Dealer
{
public:
Dealer() {}
Dealer(Card<U, V>* cardType) {}
virtual ~Dealer() {}
virtual const vector <Card<U, V>*> getHand()=0;
};
#endif // DEALER_H
最后,经销商派生类(创建该卡指针扑克牌对象)
#ifndef DEALERHOUSE_H
#define DEALERHOUSE_H
#include "Dealer.h"
template < template <class U, class V> class T>
class DealerHouse : virtual public Dealer <T> {
private:
vector <Card<U, V>* > dealerDeck;
Card <U, V> *card;
public:
DealerHouse(): Dealer<T>()
{
for (int suitInt = Clubs; suitInt != END_OF_SUITS; suitInt++)
{
for (int rankInt = Ace; rankInt != END_OF_RANKS; rankInt++)
{
card = new T((U)rankInt, (V)suitInt);
if (card != NULL)
dealerDeck.push_back(card);
else
cout <<"ERROR, card object not created in HEAP" << "\n";
}
}
ofstream myfile ("C:/Temp/dealerLogFile.txt", ios::app);
if (myfile.is_open())
{
myfile << "Default Dealer base object constructed:" << "\n";
}
}
DealerHouse(Card<U, V>* cardType): Dealer<T>(cardType)
{
dealerDeck.push_back(cardType);
ofstream myfile ("C:/Temp/dealerLogFile.txt", ios::app);
if (myfile.is_open())
{
myfile << "Parameterized Dealer base object constructed:" << "\n";
}
}
virtual ~DealerHouse()
{
if (!dealerDeck.empty())
{
dealerDeck.clear();
}
if (card != NULL)
{
delete card;
card = NULL;
}
ofstream myfile ("C:/Temp/dealerLogFile.txt", ios::app);
if (myfile.is_open())
{
myfile << "Dealer object destroyed:" << "\n";
myfile.close();
}
}
protected:
virtual const vector <Card<U, V>*> getHand()
{
return dealerDeck;
}
};
#endif // DEALERHOUSE_H
我得到这个编译错误的经销商。 h,line“Dealer(Card * cardType){}”: CardGame \ Dealer.h | 16 | error:'U'未在此范围内声明| CardGame \ Dealer.h | 16 |错误:'V'未在此范围内声明|
所以我猜我很差劲的Dealer.h模板参数声明 “模板<模板类T>类经销商”,也是那些在DealerHouse.h,它遵循相同的语法。
有任何帮助吗?我已经检查了回答类似的问题 Template parameters in C++ templates c++ template to template parameter how to declare template of template class
但是当我试图在他们所建议的声明,我得到的错误在DealerHouse.H的“T”型不“卡=新认识T((U)rankInt,(V)suitInt);“。
我明白任何帮助,我真的坚持与...
感谢您的详细回复和建议! – silvakle
让我澄清一些事情: - 我使用虚拟继承,以便实现从TarotCard和PokerCard继承的派生Card类。 - 我重新定义了卡的虚拟方法,因为这是应用程序的基础。正如我所说的,我首先在Java中完成了整个事情,我正在谈论像BlackJack和Tarot这样的纸牌游戏。我需要在实现所有其他基础之前(泛型)才能获得基础 - 我想保护来自玩家类(还有待执行)和自动化测试套件类(在此执行TDD)的数据。 – silvakle
将尽快尝试您的建议,并会回到这里... – silvakle