Ну, очевидное решение состоит в том, чтобы быть более осторожным, когда вы расширяете исходный класс.:) «Быть более осторожным» включает в себя такие вещи, как рецензирование кода и тому подобное, но, очевидно, это не доказательство глупости.
Поэтому решение этой проблемы с философской, а не технической точки зрения можетчасто дают понимание.Философия в этом случае заключается в том, чтобы быть параноиком.Предположим, что код, который вы пишете сегодня, будет нарушен через несколько месяцев или лет.(Отредактируйте комментарии @ Ноя ниже: чаще всего этот самозванец - это я сам. Будучи параноиком, я защищаю себя от себя , вероятно, больше, чем кто-либо другой.) Если вы можете что-то сделать, чтобы гарантировать, что когда придурокнарушает ваш код, что-то не получается перед поставкой продукта, это поможет.
Мне нравятся две вещи: статические утверждения и модульные тесты.Статическое утверждение может использоваться в вашем коде operator==
, чтобы убедиться, что ваш класс sizeof
соответствует вашим ожиданиям.Например:
bool MyClass::operator==(const MyClass& rhs) const
{
static_assert(sizeof(MyClass) == sizeof(foo_) + sizeof(bar_))
...
}
... где foo_
и bar_
- переменные-члены.Это нарушит компиляцию при изменении размера класса.
Поскольку статическое утверждение обычно принимает форму шаблонного класса, который не будет компилироваться, когда выражение ложно.Это может быть немного сложно написать (но это интересное упражнение - подумайте, что произойдет, если вы попытаетесь добавить члена char test_[0]
в класс).К счастью, это колесо уже изобретено.См. Boost для примера, и я думаю, что новый компилятор MSVC также поставляется с ним.