У меня есть два каталога (затмение проектов в случае, если это имеет значение)нагрузки с переменной-члена из DLL/так с pugg
PuggMain/
├── OutputDataWrapper.h
└── PuggMain.cpp
OutputDataWrapper.h
с
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;
}
}
и другая директория со следующими файлами
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 члена от Cat, он работает, как ожидалось:
Loading plugins...
loded plugin from kernel
Animal kind = Cat
Can Animal Swim = 0
Это работа с другими переменными-членами любит Int и строку, однако.
Вопрос в том, почему? Мне явно не хватает чего-то, скорее всего, из-за недостатка понимания, но я не уверен, как справиться с этим.
Если вы сделали это, то через вопрос, танки уже для чтения. Буду признателен за любой вклад.
Торможение? Функции идут медленнее, чем раньше? –