Конструкция наследования алмазов c ++ только базовым конструктором - PullRequest
0 голосов
/ 18 мая 2018

enter image description here

У меня проблемы с созданием класса ферзя из части, которая является базовым классом, у меня был виртуальный класс ладьи и слона, чтобы избежать проблемы с дублированием,прямо сейчас я получил ошибку, указав, что Ладья и Епископ виртуальны, и у них нет конструктора по умолчанию.

здесь мое объявление класса

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)
{

}

1 Ответ

0 голосов
/ 18 мая 2018

Помните, что при создании объекта Queen этот объект включает в себя объект Rook и объект Bishop.Оба этих объекта также должны быть созданы при создании объекта Queen.

Поскольку ваш код в данный момент написан, компилятор попытается вызвать конструкторы по умолчанию Bishop() и Rook() для создания экземпляров этих объектов.objects.

Но ваш код не определяет конструкторы 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) выполняют реальную работу, тогда этот второй подход является единственным реальным решением (при условии, что tРеальная работа зависит от переданных им параметров Color и Position).

...