C ++: инициализация переменных; перегрузить неявный конструктор? - PullRequest
4 голосов
/ 30 марта 2012

Я хочу переопределить библиотеку, в которой у меня есть файл заголовка. Я бы предпочел не изменять файл .h, так как это потребовало бы изменений в программах, которые используют библиотеку (плюс некоторые юридические причины). РЕДАКТИРОВАТЬ: Я также не могу изменить код, который использует библиотеку и создает экземпляр класса X!

lib.h определяет класс X (упрощенная версия):

class X 
{
public:
    bool Function(BOOL q, INT p);
    BOOL a;
    INT b;
};

(BOOL и INT - это только некоторые типы данных, используемые библиотекой, эти классы оборачивают примитивный тип данных bool и int).

Я реализовал этот класс в my_lib_implementation.cpp:

bool X::Function(BOOL q, INT p)
{
    return true;
}

Файл .h не определяет конструктор, так что это означает, что существует неявный конструктор (верно?). Проблема в том, что мне нужно инициализировать переменные a и b, чтобы моя реализация функции (BOOL q, INT p) работала правильно. Однако, если я добавлю следующее, я получу ошибки компиляции («ошибка: определение неявно объявленного« X :: X () »», gcc 4.4):

X::X()
{
    a=true;
    b=0;
}   

Можно ли перегрузить конструктор какой-то магией, о которой я не знаю? Есть ли другие варианты инициализации переменных? Существует реализация библиотеки (которую я не могу использовать), поэтому кажется, что это должно быть как-то возможно?

Я только начал программировать на C ++ на этой неделе (у меня большой опыт работы с другими языками), так что эта проблема, вероятно, просто отсутствие у меня базовых знаний. Надеюсь, вы, ребята, можете мне помочь!

Ответы [ 3 ]

3 голосов
/ 30 марта 2012

Нет, это невозможно, сгенерированный компилятором конструктор по умолчанию не может быть перегружен.

Однако вы можете инициализировать элементы следующим синтаксисом:

X x = {true, 0};
2 голосов
/ 30 марта 2012

На самом деле нет способа напрямую выполнить то, что вы просите.(Предоставьте конструктор по умолчанию, не объявляя его в классе.)

Самое близкое, к чему вы можете прийти, это также переопределить классы BOOL и INT, предполагая, что в них определены конструкторы по умолчанию.Если они есть, то вы можете изменить значение по умолчанию на любое другое.

В качестве альтернативы, вы можете полностью изменить поведение функции.Вы можете добавить членов в класс, в том числе, например, что-нибудь, чтобы отслеживать, была ли вызвана функция, сколько раз и т. Д. Или вы можете определить свой собственный член betterthanX и просто перенаправить вызовы функции этому члену.и затем скопируйте результаты обратно в члены реального класса X.

1 голос
/ 30 марта 2012

Очень грязным хаком может быть определение макроса препроцессора непосредственно перед включением заголовочного файла библиотеки, который меняет X на X_. Затем вы можете определить свой собственный X, который наследуется от X_ и определяет любой конструктор, который вам нравится. Вы должны #undef макрос после #include. Не вините меня, если вы столкнетесь с коварными ошибками.

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