Отладочные сбои из-за изменения размера базового класса - PullRequest
0 голосов
/ 23 декабря 2011

В последнее время я сталкивался с несколькими сбоями из-за изменений размера класса в базовом классе, а производный класс не компилировался. Позвольте привести простой пример. У меня есть базовый класс BaseClass, присутствующий в Base.dll, и я унаследовал этот класс и создал DerivedClass, который присутствует в Derived.dll. При каждом изменении размера BaseClass Derived.dll следует перекомпилировать. Но не всегда возможно найти все зависимые двоичные файлы, и иногда люди пропускают несколько зависимых двоичных файлов. В этих случаях мы получаем загадочные сбои, которые очень сложно отладить. Есть ли способ сузить такие проблемы? Другими словами, какие подсказки позволят вам думать в этом направлении?

РЕДАКТИРОВАТЬ 1: Подробнее. Предположим, что существует более одного базового класса, скажем, base1, base2, base3 и т. Д., Каждый из которых получен в отдельных библиотеках. производная1.dll, производная2.dll и производная3.dll. Нет необходимости компилировать все остальные проекты для изменения размера в одном базовом классе. Кроме того, создание зависимостей не вариант, поэтому мы часто сталкиваемся с этой проблемой.

Ответы [ 2 ]

0 голосов
/ 23 декабря 2011

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

Второй способ - всегда «перестраивать все». Или всегда удаляйте все в каталоге obj и собирайте.

Метод третий: добавить код режима отладки, который проверяет размер (-и) объектов и сравнивает их с новыми вызовами через границу API, что возвращает размер (-ы) объектов, находящихся там.

0 голосов
/ 23 декабря 2011

Нет никакой дополнительной опции, кроме перекомпиляции.Если выяснить, какие классы являются производными от вашего class BaseClass, является проблемой, то это можно решить следующим образом.

class FinalLock {
  FinalLock () {}
  friend class BaseClass;
};

При каждом изменении размера BaseClass выполните следующие действия:

class BaseClass : virtual FinalLock {
  ...
};

И перекомпилируйте весь проект.Какие бы классы ни происходили из BaseClass, это вызовет ошибку компилятора (фактически, создание экземпляров классов вызовет ошибку).

Это говорит вам, какие классы зависят от BaseClass.Это упражнение нужно только один раз.Затем вы можете пометить весь зависимый код.

Удалите этот дополнительный код, как только вы закончите.С C ++ 11 указанную выше технику можно сделать еще проще:

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