Я испорчу свое наследство - PullRequest
2 голосов
/ 14 июня 2011

Итак, у меня есть класс Piece, который должен представлять фигуры на доске, от которого я планирую наследовать два других класса. Однако, у меня много проблем с этим; вот соответствующий код на данный момент.

///
/// PIECE CLASS HERE
/// this is an abstract class from which Barrier and Pawn inherit.

class Piece
{
public:
    Piece(Space* start);
    sf::Shape m_Circle;
protected:
    int m_X;
    int m_Y;
    int m_radius;
    Space* CurrentSpace;
};

Piece::Piece(Space* start):
    m_X(start->GetX()),
    m_Y(start->GetY()),
    m_radius(14),
    CurrentSpace(start)
{}

///
/// BARRIER CLASS HERE
/// these are the white stones that block a player's path

class Barrier : public Piece
{
public:
    Barrier(Space* initial);
    void Move(Space* target, bool isCapturing);
};

Barrier::Barrier(Space* initial)
{
    Piece(initial);
    m_Circle = sf::Shape::Circle((float)m_X, (float)m_Y, (float)m_radius, sf::Color(255, 255, 255));
    Move(initial);
}

void Barrier::Move(Space* target, bool isCapturing)
{
    int xChange = abs(target->GetX() - m_X);
    int yChange = abs(target->GetY() - m_Y);
    m_Circle.Move((float)xChange, (float)yChange);
    CurrentSpace.ToggleOccupied();
    if(!isCapturing)
    {
        (*target).ToggleOccupied();
    }
    CurrentSpace = target;
}

Я получаю массу ошибок, которые не понимаю, в частности:

no matching function for call to Piece::Piece()
declaration of 'Piece initial' shadows a parameter
no matching function for call to 'Barrier::Move(Piece&)'
request for member 'ToggleOccupied' in '((Barrier*)this)->Barrier::<anonymous>.Piece::CurrentSpace', which is of non-class type 'Space*'|

Будучи новичком в C ++, я не понимаю, что с этим не так. Я пытался создать свой код, аналогичный коду, который я нашел в книге, которую я использовал для изучения C ++, но, очевидно, я упустил некоторые тонкости. Кажется, все функции, которые я пытаюсь вызвать, существуют в соответствующих местах, и я определяю их с теми же значениями, что и в их прототипе, я думаю.

Ответы [ 4 ]

12 голосов
/ 14 июня 2011

Первая ошибка вызвана следующим:

Barrier::Barrier(Space* initial)
{
    Piece(initial);
    m_Circle = sf::Shape::Circle((float)m_X, (float)m_Y, (float)m_radius, sf::Color(255, 255, 255));
    Move(initial);
}

Должен выглядеть следующим образом:

Barrier::Barrier(Space* initial) : Piece(initial)
{
    m_Circle = sf::Shape::Circle((float)m_X, (float)m_Y, (float)m_radius, sf::Color(255, 255, 255));
    Move(initial);
}

Конструктор базового класса запускается перед вашим конструктором (независимо от того, что) -вам нужно передать ему аргументы, если для этого требуются аргументы в списке инициализации.

Я не уверен насчет других ошибок, потому что не знаю, в каких строках они встречаются.

4 голосов
/ 14 июня 2011

Скобки в строке

Piece(initial);

игнорируются компилятором.Вы объявляете переменную с тем же именем, что и у параметра:

Piece initial;

Чтобы инициализировать базовый объект Piece с initial, необходимо использовать список инициализатора элемента:

Barrier::Barrier(Space* initial) : Piece(initial)

Кроме того, функция Move ожидает два аргумента, но вы передаете только один.Вы забыли логическое значение.

1 голос
/ 14 июня 2011

Хорошие ответы, все. Плюс эта последняя страшная линия

request for member 'ToggleOccupied' in '((Barrier*)this)->Barrier::<anonymous>.Piece::CurrentSpace', which is of non-class type 'Space*'|

вызывается из

CurrentSpace.ToggleOccupied();

вы объявили CurrentSpace указателем, поэтому это должно быть

CurrentSpace-> ToggleOccupied ();

1 голос
/ 14 июня 2011

Если вы хотите инициализировать суперкласс, вы должны сделать это так:

Barrier(Space* initial): 
    Piece(initial) {
    ...
}

Если вы не инициализируете базовый тип явно, компилятор попытается инициализировать его, вызвав конструкторс пустым списком аргументов, например:

Barrier(Space* initial):
    Piece() {
    ... 
}

Но так как вы не определяете конструктор для Piece, который принимает нулевые аргументы, вы получаете ошибку компилятора, которую вы описали.

...