私はあなたが共有ライブラリ、ROS生態系C++の継承について知っているが、ここでいくつかの基本的な事は
ROSは、二つのパッケージ
class_loader
が付属しています知っているどのくらいかわからない:負荷が共有しましたランタイム中のライブラリ
pluginlib
:ros固有のクラスローダは、class_loaderに基づいています。これは、生態系内のライブラリを見つけて読み込むのに役立ちます。 :ここ
は、基本的なセットアップ
であるあなたは、抽象インターフェースクラスMyBase
とそれのいくつかの実装を持っている。このライブラリで「libMyLibrary.so」 としてコンパイルMyLibrary
と呼ばれるライブラリを持っています
// file: MyBase.h
class MyBase{
public:
virtual void foo() = 0;
};
-------
// file: MyBaseMainImplementation.h
class MyBaseMainImplementation: public MyBase{
public:
void foo();
};
// file: MyBaseMainImplementation.cpp
void MyBaseMainImplementation::foo() { std::cout << "bar" << std::endl; };
// Make this class loadable from other libraries. This enables it to act like a
// plugin
CLASS_LOADER_REGISTER_CLASS(MyBaseMainImplementation, MyBase);
-------
// file: MyBaseOtherImplementation.h
class MyBaseOtherImplementation: public MyBase{
public:
void foo();
};
// file: MyBaseOtherImplementation.cpp
void MyBaseMainImplementation::foo() { std::cout << "foo bar" << std::endl; };
// Make this class loadable from other libraries. This enables it to act like a
// plugin
CLASS_LOADER_REGISTER_CLASS(MyBaseOtherImplementation, MyBase);
MyBase
の実装を使用したいのに、2番目のライブラリまたは実行可能プログラム(プログラム)で、knこれはコンパイル時に利用可能です。あなたにできることは、あなたがここに必要な唯一のものは、すなわちMyBase.h
、MyBaseクラスのヘッダである
// load libMyLibrary.so
class_loader::ClassLoader loader("libMyLibrary.so");
// create instance of a class from libMyLibrary.so
boost::shared_ptr<MyBase> my_base_impl =
loader.createInstance<MyBase>("MyBaseMainImplementation");
をしたいMyBase
の実装を持っている実行時に任意のライブラリをロードするためにclass_loader
を使用しています主な質問に戻るC++のプラグインとは何ですか?さてここで
MyBase
の様々な実装、すなわちMyBaseMainImplementation
とMyBaseOtherImplementation
がlibMyLibrary.soにリンクすることなく、実行時にロードすることができるプラグインです。それがすべてです。
質問が回答しましたか? – cassinaj