Разрыв кода при попытке установить переменную-член в конструкторе - PullRequest
0 голосов
/ 11 декабря 2010

У меня есть такой класс:

class Player
{
public:
    Player(Board * someBoard);

    void setSide(char newSide);

protected:
    Board * board;
    char side;
};

и его реализация такова:

Player::Player(Board * someBoard)
{
    board = someBoard;
    side = '0';
}

void Player::setSide(char newSide)
{
    side = newSide;
}

Теперь у меня есть другой класс, унаследованный от него:

class HumanPlayer : public Player
{
public:
    HumanPlayer(Board * someBoard);
};

И его короткая реализация такова:

HumanPlayer::HumanPlayer(Board * someBoard) : Player(someBoard)
{
}

Теперь проблема в том, что строка side = '0'; останавливает программу (окно становится белым в Windows 7, не уверенный, означает ли это, что оно зависло или зависло). Закомментирование заставляет программу работать нормально (и можно закомментировать, потому что переменная еще нигде не используется).

Что является причиной ошибки и как ее исправить?

EDIT!

После распечатки некоторого материала на fstream программа неожиданно сработала. Я попытался закомментировать распечатку. Это все еще работало. Я попытался удалить код отладки, который я добавил. Это все еще работало. Так что теперь мой код точно такой же, как перечисленный выше, но теперь он волшебным образом работает.

Так что мне теперь делать? Игнорировать аномалию? Может быть, это ошибка компилятора?

Ответы [ 2 ]

2 голосов
/ 11 декабря 2010

Я подозреваю, что проблема не в том, о чем вы думаете.

Звучит как проблема повреждения памяти, но на самом деле невозможно определить, основываясь на предоставленной информации.У меня есть два предложения для вас:

  1. Либо отправьте самую маленькую полную программу, которая демонстрирует проблему, либо
  2. Попробуйте инструмент типа valgrind чтобы узнать, поможет ли это вам понять, что происходит.

Или, что еще лучше, начните с просмотра состояния программы в отладчике (после зависания).

1 голос
/ 11 декабря 2010

Возможно ли, что вы используете два несовместимых определения вашего класса Player, определенных в разных заголовочных файлах? Если определения имеют разные размеры, то элемент «size» может находиться вне блока памяти, выделенного для экземпляра класса.

Редактировать Я вижу, что ваша проблема исчезла. Так что, вероятно, это был модуль, который не был перекомпилирован после изменения определения класса; но теперь, когда вы перекомпилировали все, проблема устранилась.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...