Общий объект в зависимости от символа в коде, который динамически связывает его? - PullRequest
1 голос
/ 08 ноября 2019

У меня есть общий объект my_lib.cc, который определяет в своем заголовке класс вместе с фабричной функцией:

extern Foo* GetFoo():

class Foo {
 public:
  Foo() {}
  virtual ~Foo() {}
};

Теперь я хотел бы, чтобы приложение, использующее библиотеку main.cc, содержало:

#include "my_lib.h"

class Bar : public Foo {
  // ...
};

Foo* GetFoo() {
  return new Bar();
}

Дело в том, что когда код внутри общего объекта должен создать Foo, он будет вызывать метод, предоставляемый приложением, динамически связывающим его. Возможно ли это сделать? Как правило, приложение зависит от символов, предоставляемых общими объектами, но возможно ли, чтобы общий объект зависел от символа в двоичном файле, который динамически загружает его?

1 Ответ

0 голосов
/ 08 ноября 2019

Динамическое связывание идет в одну сторону, от пользователя библиотеки → к библиотеке.

Обратные вызовы из библиотеки пользователю обычно выполняются через указатель функции:

В my_lib.cc:

Foo* (*MakeFoo)();

void setFooFactory(Foo* (*pMakeFoo)()) {
   MakeFoo = pMakeFoo;
}

Затем в main.cc:

Foo* MakeBar() {
  return new Bar();
}

int main() {
    // load my_lib ...
    setFooFactory(MakeBar);

    // . . .
}

Вы также можете обернуть MakeFoo() в фабрику class и использовать механизм виртуальных функций C ++. Я просто демонстрирую основную идею.

...