没有默认构造函数的C ++继承

时间:2014-01-08 11:19:34

标签: c++ linker-errors lnk2019

所以我试图实施国际象棋游戏。我有最常见的链接错误:

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错误。

现在我知道解决方案应该是向两个类添加默认构造函数(由于某种原因这不起作用)但我不希望它们使用默认值进行初始化。因此,我不希望任何这些类的默认构造函数。

有没有办法我不创建默认构造函数并侥幸逃脱它?

2 个答案:

答案 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;