编译器提示错误为
1>Hand.obj : error LNK2019: 无法解析的外部符号 "public: __thiscall Card::~Card(void)" (??1Card@@QAE@XZ),该符号在函数 "public: void * __thiscall Card::`scalar deleting destructor'(unsigned int)" (??_GCard@@QAEPAXI@Z) 中被引用
1>C:\Users\Administrator\Desktop\通过游戏编程实战教新手学C++编程\21点\Debug\21点.exe : fatal error LNK1120: 1 个无法解析的外部命令
HAND.H
#pragma once
#include "Card.h"
#include <vector>
// 定义一个手牌类
class Hand
{
public:
Hand(void);
virtual ~Hand(void);
void Add(Card *pCard); // 添加一张pCard指向的卡
void Clear(); // 清空手中所有卡
int GetTotalValue() const; // 获取手牌中所有牌的点数和
protected:
vector<Card*> m_Cards;
};
HAND.CPP
#include "Hand.h"
Hand::Hand(void)
{
m_Cards.reserve(7); //假定每个玩家最多摸7张牌,预留7张牌大小的容器
}
Hand::~Hand(void)
{
Clear();
}
void Hand::Add(Card *pCard)
{
m_Cards.push_back(pCard);
}
int Hand::GetTotalValue() const
{
if (m_Cards.empty()) // 假如手牌为空
{
return 0;
}
if (m_Cards[0]->GetValue()==0) //假如第一张手牌获取到的点数为0,即第一张牌反面朝上
{
return 0;
}
int TotalValue=0;
vector<Card*>::const_iterator iter;
for (iter=m_Cards.begin();iter!=m_Cards.end();iter++)
{
TotalValue+=(*iter)->GetValue(); // 将每一张手牌的点数相加
}
bool contanACE=false;
for (iter=m_Cards.begin();iter!=m_Cards.end();iter++)
{
if ((*iter)->GetValue()==Card::ACE) //遍历查找手牌中是否有A
{
contanACE=true;
break;
}
}
if (contanACE==true&&TotalValue<11) // 此情况下视A为11点
{
TotalValue+=10;
}
return TotalValue;
}
void Hand::Clear()
{
vector<Card*>::iterator iter=m_Cards.begin();
for (iter=m_Cards.begin();iter!=m_Cards.end();iter++)
{
delete *iter; // 释放堆中的每一个内存
*iter=NULL;
}
m_Cards.clear();
}
CARD.H
#pragma once
#include <iostream>
using namespace std;
// 扑克牌类型Card
class Card
{
public:
enum point{ACE=1,TWO,THREE,FOUR,FIVE,SIX,SEVEN,EIGHT,NINE,TEN,JACK,QUEEN,KING};
enum kind{HeiTao,HongXin,MeiHua,FangKuai};
Card(point m_point=ACE,kind m_kind=HeiTao,bool m_IsFaceUp=true);
int GetValue() const; // 返回牌的点数
void Filp(); // 将牌翻面
friend ostream& operator<<(ostream &os,const Card &rCard); //重载运算符,输出Card对象
~Card(void);
protected:
point m_point; // 牌的点数
kind m_kind; // 牌的花色
bool m_IsFaceUp; // 牌是否正面朝上
};
CARD.CPP
#include "Card.h"
#include
Card::Card(point p,kind k,bool ifu):m_point(p),m_kind(k),m_IsFaceUp(ifu)
{
}
int Card::GetValue() const
{
int Value=0;
if (m_IsFaceUp) // 假如牌正面朝上则可以读出点数
{
Value=m_point;
if (Value>10) // 出现“J,Q,K”情况,都视为10点
{
Value=10;
}
}
return Value;
}
void Card::Filp()
{
m_IsFaceUp=!(m_IsFaceUp); // 正面朝上翻转后正面朝下,翻面朝上翻转后正面朝上
}