Liu Zhian 2017-05-07 06:47 采纳率: 60%
浏览 864
已采纳

关于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条回答 默认 最新

  • 战在春秋 2017-05-07 07:49
    关注

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

    需要将

     ~Card(void);
    

    修改为

     ~Card(void){};  
    

    这是个比较隐蔽的错误。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 YoloV5 第三方库的版本对照问题
  • ¥15 请完成下列相关问题!
  • ¥15 drone 推送镜像时候 purge: true 推送完毕后没有删除对应的镜像,手动拷贝到服务器执行结果正确在样才能让指令自动执行成功删除对应镜像,如何解决?
  • ¥15 求daily translation(DT)偏差订正方法的代码
  • ¥15 js调用html页面需要隐藏某个按钮
  • ¥15 ads仿真结果在圆图上是怎么读数的
  • ¥20 Cotex M3的调试和程序执行方式是什么样的?
  • ¥20 java项目连接sqlserver时报ssl相关错误
  • ¥15 一道python难题3
  • ¥15 牛顿斯科特系数表表示