を持つように(場合にプロジェクトを日食事項である)OutputDataWrapper.h
ロードDLLからメンバ変数を持つクラス/私は2つのディレクトリを持っているpugg
class OutputDataWrapper {
public:
OutputDataWrapper();
virtual ~OutputDataWrapper();
};
とPuggMain.cpp
#include <iostream>
#include <Kernel.h>
#include <Animal.h>
#include <iostream>
#include <vector>
using namespace std;
int main()
{
cout << "Loading plugins..." << endl;
pugg::Kernel kernel;
kernel.add_server(Animal::server_name(), Animal::version);
kernel.load_plugin("libPuggSharedLib.so");
vector<AnimalDriver*> drivers =kernel.get_all_drivers<AnimalDriver>(Animal::server_name());
vector<Animal*> animals;
for (vector<AnimalDriver*>::iterator iter = drivers.begin(); iter != drivers.end(); ++iter) {
AnimalDriver& driver = *(*iter);
animals.push_back(driver.create());
cout << "loded plugin from kernel" << endl;
}
for(vector<Animal*>::iterator iter = animals.begin(); iter != animals.end(); ++iter) {
Animal& animal = *(*iter);
cout << "Animal kind = " << animal.kind() << endl;
cout << "Can Animal Swim = " << animal.can_swim() << endl;
}
for(vector<Animal*>::iterator iter = animals.begin(); iter != animals.end(); ++iter) {
delete *iter;
}
}
と
PuggMain/
├── OutputDataWrapper.h
└── PuggMain.cpp
とその他のディレクトリ
PuggSharedLib/
├── Animal.h
├── Cat.h
├── Driver.h
├── Kernel.h
├── plugin.cpp
└── Plugin.h
ファイルDriver.h
、Kernel.h
、Plugin.h
とplugin.cpp
はhttp://pugg.sourceforge.net/から直接取得されます。
Animal.h
:
#include <string>
class Animal {
public:
Animal() {}
virtual ~Animal() {}
virtual std::string kind() = 0;
virtual bool can_swim() = 0;
static const int version = 1;
static const std::string server_name() {return "AnimalServer";}
};
class AnimalDriver : public pugg::Driver {
public:
AnimalDriver(std::string name, int version) : pugg::Driver(Animal::server_name(),name,version) {}
virtual Animal* create() = 0;
};
Cat.h
:
#include "Animal.h"
#include "OutputDataWrapper.h"
class Cat : public Animal {
public:
std::string kind() {return "Cat";}
bool can_swim() { return false; }
private:
OutputDataWrapper m_wrapper;
};
class CatDriver : public AnimalDriver {
public:
CatDriver() : AnimalDriver("CatDriver", Cat::version) {}
Animal* create() {return new Cat();}
};
PuggMainを実行しているからの出力は次のとおりです。ドライバーベクトルは何も入っていないことを意味し
Loading plugins...
dlopen: Success
。私は猫からメンバ変数m_wrapperを削除する場合でも、期待どおりに動作します:
Loading plugins...
loded plugin from kernel
Animal kind = Cat
Can Animal Swim = 0
これは、他のメンバ変数では動作しないがint型と文字列が好き。
私の質問は単に理由は何ですか?私は明らかに理解の欠如のために何かを紛失していますが、これに対処する方法がわかりません。
あなたが作成したのであれば、これはすでに読んでいるタンクの問題です。私はどんな入力にも感謝します。
減速?機能は以前よりも遅くなっていますか? –