рефакторинг — Как исправить странные коды C ++, которые предполагают относительный порядок членов класса

Мне нужно изменить порядок членов моего класса C ++. Например:

class B {
public:
int i;
int j;
int k;
...
};

становится

class B {
public:
int j;
int k;
int i;
...
};

Проблема в том, что в моих больших кодовых базах есть странные коды, которые зависят от относительного расположения членов класса. Например, некоторые функции предполагают, что адрес члена j меньше адреса члена k.

Есть ли какой-либо инструмент CASE, который может помочь мне идентифицировать любой код, который читает адрес члена класса?

1

Решение

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

Что-то вроде

class IntWrapper {
public:
IntWrapper() { }
IntWrapper(const int x) { }         // don't care about implementation as we
operator int() const { return 0; }  // want compile-time errors only
IntWrapper& operator ++() { return *this; }
IntWrapper& operator ++(int) { return *this; }

...
void operator &() const { } // make it void so it would cause compiler error
};

А потом:

class B {
public:
IntWrapper i;
IntWrapper j;
IntWrapper k;
...
};

Это не поможет против использования boost::addressof функция или какая-то грязная reinterpret_cast ссылки, но addressof вероятно, никогда не используется в вашем проекте, а также reinterpret_cast<char&> трюк (кто бы использовал его для простых целых чисел?).

Вы также должны позаботиться о том, чтобы взять адрес всего объекта B учебный класс.

3

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]