关于C++编译时的报错,求帮忙指出?

编译器提示错误为
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); // 正面朝上翻转后正面朝下,翻面朝上翻转后正面朝上
}



1个回答

如果你未定义析构函数,编译器会自动生成默认析构函数。
但题目中,你试图自己定义Card类的析构函数,只是定义语法不对,所以导致错误。

需要将

 ~Card(void);

修改为

 ~Card(void){};  

这是个比较隐蔽的错误。

caozhy
贵阳老马马善福专业维修游泳池堵漏防水工程 正确,析构函数不能有参数
大约 3 年之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问
相关内容推荐