我很难构建我的女王班,使用这个基础类,我有虚拟我的车和主教类,以防止重复的问题。现在我得到了错误声明Rook和Bishop是虚拟的,它没有默认的构造函数。
这里是我的班级声明
class Piece
{
public:
Piece(Colour c, const Position& pos);
virtual ~Piece();
private:
Colour piece_colour;
Position piece_pos;
};
class Bishop: public virtual Piece
{
public:
Bishop(Colour c, const Position& pos);
~Bishop();
};
class Rook: public virtual Piece
{
public:
Rook(Colour c, const Position& pos);
~Rook();
};
#ifdef MSC_VER
class Queen: public virtual Piece, public Bishop, public Rook
#else
class Queen: public Bishop, public Rook
#endif
{
public:
Queen(Colour c, const Position& pos);
~Queen();
};
这是我的工具
Piece::Piece(Colour c, const Position& pos)
:piece_colour{c}, piece_pos{pos}
{
}
Bishop::Bishop(Colour c, const Position& pos)
:Piece(c,pos)
{
}
Rook::Rook(Colour c, const Position& pos)
:Piece(c,pos)
{
}
Queen::Queen(Colour c, const Position& pos)
:Piece(c,pos)
{
}
答案 0 :(得分:0)
请记住,在构造Queen
对象时,该对象包含Rook
个对象和Bishop
个对象。在构造Queen
对象时,还必须构造这两个对象。
由于您的代码当前已编写,编译器将尝试调用默认构造函数Bishop()
和Rook()
来实例化这些对象。
但您的代码未定义Bishop()
和Rook()
构造函数 - 因此您会收到错误消息,告知您Bishop
和Rook
类没有默认值构造函数定义。
解决问题的一种方法是定义默认构造函数Bishop()
和Rook()
以及默认构造函数Piece()
...
protected:
Piece::Piece() { }
Bishop::Bishop() { }
Rook::Rook() { }
...如果你这样做,你将要构建那些构造函数protected
,这样它们只能从派生类中调用。
另一种方法是更改Queen
构造函数,以显式调用已定义的Bishop
和Rook
构造函数...
Queen::Queen(Colour c, const Position& pos)
: Bishop(c, pos), Rook(c, pos), Piece(c, pos)
如果您的Bishop(c, pos)
和Rook(c, pos)
构造函数真正起作用,那么第二种方法是唯一真正的解决方案(假设实际工作取决于传递给它们的颜色和位置参数)。