Я занимаюсь разработкой библиотеки в DLL. Чтобы поддерживать ABI, я использовал подход, который использует интерфейс, который экспортируется в мой клиент, и реализует этот интерфейс в моей библиотеке. Чтобы моя библиотека работала, мне нужно большое количество входных параметров от пользователя, для этого я объявил класс данных и взял ссылку в качестве входного параметра в одной из функций интерфейса.
Например:
class CInputParam
{
public:
int a;
//......
int b;
};
class ISample
{
public:
virtual void SetInputParam(CInputParam& )=0;
virtual void DoWork()=0;
};
class CConcrete : public ISample
{
};
У меня два вопроса.
1) Если в будущем мне потребуется добавить какой-либо новый входной параметр, скажем, «int c», я добавлю его в CInputParam, но это нарушит ABI, так как мне нужно перекомпилировать все мои клиенты. Что может быть лучшим решением?
2) Если мне нужно добавить новую виртуальную функцию, могу ли я получить новый интерфейс ISample2 из ISample, добавить новую виртуальную функцию и изменить конкретный класс, производный от ISample2 (ранее производный от ISample).
class ISample2 : public ISample
{
public:
virtual void NewFunction()=0;
};
class CConcrete : public ISample2
{
};
Задача ещё не решена.
Других решений пока нет …