Bạn không thể tải các lớp tại thời gian chạy vì C++ là một ngôn ngữ và các lớp được biên dịch không tồn tại trong thời gian chạy. Các đối tượng (các thể hiện của các lớp) làm.
Việc bạn có thể làm là tải các thư viện được chia sẻ vào thời gian chạy và làm cho chúng tạo các đối tượng của một giao diện nhất định.
Triển khai trình cắm thêm tối thiểu sẽ xác định giao diện của trình cắm của bạn và giao diện của chức năng nhà máy sẽ tạo đối tượng với giao diện đó. Bạn sẽ tải thư viện được chia sẻ vào thời gian chạy, tìm hàm nhà máy với một tên nhất định và gọi hàm nhà máy để tạo một đối tượng. Sau đó, bạn sử dụng đối tượng đó mặc dù giao diện:
// plugin.h start
#include <memory>
struct PlugIn // interface
{
virtual ~PlugIn() = 0;
virtual void doSomething() = 0;
};
extern "C" {
typedef std::auto_ptr<PlugIn> PlugInFactoryFn();
// A plugin .so must export this one factory function.
std::auto_ptr<PlugIn> createPlugIn();
}
// plugin.h end
// somewhere in you application
#include "plugin.h"
#include <assert.h>
#include <dlfcn.h>
std::auto_ptr<PlugIn> loadPlugIn(char const* filename)
{
void* so = dlopen(filename, RTLD_NOW | RTLD_LOCAL);
assert(so);
void* factory_function = dlsym(so, "createPlugIn");
assert(factory_function);
return reinterpret_cast<PlugInFactoryFn*>(factory_function)();
}
int main()
{
std::auto_ptr<PlugIn> a(loadPlugIn("a.so"));
std::auto_ptr<PlugIn> b(loadPlugIn("b.so"));
a->doSomething();
b->doSomething();
}
Nguồn
2011-01-26 14:15:55
Bạn đã đăng các giải pháp được đề xuất cho một vấn đề mà bạn không nêu. Yêu cầu của bạn là gì? –