所以我试图实施国际象棋游戏。我有最常见的链接错误:
error LNK2019: unresolved external symbol "public: __thiscall Bishop::~Bishop(void)" (??1Bishop@@QAE@XZ) referenced in function _main
所以这是两个相关的类:
Bishop.h(没有“Bishop.cpp”)
#pragma once
#ifndef BISHOP_H
#define BISHOP_H
#include "ChessPiece.h"
class Bishop : public ChessPiece
{
public:
Bishop(bool isWhite) : ChessPiece(isWhite) {
}
~Bishop(void);
// pure virtual functions
virtual CellLocation *listAvailableMoves(void) {
return 0;
}
virtual char getPieceType() {
return PIECE_TYPE_BISHOP;
}
};
#endif
ChessPiece.h(没有“ChessPiece.cpp”)
#ifndef CHESSPIECE_H
#define CHESSPIECE_H
#include "Globals.h"
// Abstract class for inheritence
class ChessPiece {
public:
// Constructor
ChessPiece(bool isWhite) : m_isWhite(isWhite) {
}
~ChessPiece(void);
// pure virtual functions
virtual CellLocation *listAvailableMoves(void) = 0;
virtual char getPieceType() = 0;
// ACCESSORS, MUTATORS
// isWhite member
bool isWhite(void) const{
return m_isWhite;
}
void setIsWhite(bool isWhite) {
m_isWhite = isWhite;
}
protected:
bool m_isWhite;
};
#endif
在“Globals.h”中,对这些的定义很少,但它与我的功能无关。 所以我在main中所做的只是:
Bishop somePiece(true);
cout << sizeof(somePiece) << endl;
但它发出了LNK2019错误。
现在我知道解决方案应该是向两个类添加默认构造函数(由于某种原因这不起作用)但我不希望它们使用默认值进行初始化。因此,我不希望任何这些类的默认构造函数。
有没有办法我不创建默认构造函数并侥幸逃脱它?
答案 0 :(得分:5)
你的问题是关于析构函数:
unresolved external symbol "public: __thiscall Bishop::~Bishop(void)"
^
// Notice the ~
您声明了一个析构函数,但没有为它提供实现。
答案 1 :(得分:5)
您缺少~ChessPiece(void);
和~Bishop(void);
的定义。这就是编译器所抱怨的。
另请注意,当您声明ChessPiece(bool)
时,默认的ChessPiece()
构造函数不再可用:因此您将无法默认构造ChessPiece
。
但是如果您使用的是C ++ 11,并且由于某些原因您希望手动删除默认构造函数,则可以使用:
ChessPiece() = delete;