2013-05-11 54 views
6

Im vẫn còn một chút mới để C + +, do đó, gấu với noobiness của tôi.C++ Tự động tải các lớp học

Điều tôi muốn là có thể cho phép người dùng chương trình của tôi có thể thêm các lớp học của riêng mình. Tôi có một lớp trừu tượng Module và ứng dụng của tôi bao gồm một tập hợp các lớp con của Module.

Có thể tìm kiếm một thư mục cụ thể và tự động tải các lớp con của Module (được thêm bởi người dùng) không?

Trong Java, tôi có thể đạt được điều này bằng cách sử dụng API org.reflections. Tôi đoán tương đương C++ đang sử dụng DLL. Tôi có thể sai.

Xin cảm ơn trước.

+2

Có nó là có thể sử dụng thư viện liên kết động Shread. Nó sẽ là nền tảng spercific, nguyên nhân. Bạn có thể xem xét sử dụng 'Qt' ([Qt plugins] (http://qt-project.org/doc/qt-4.8/plugins-howto.html)) hoặc một số hệ thống plugin khác. – Lol4t0

Trả lời

5

Theo hiểu biết của tôi, mô hình biên dịch C++ không có cách trực tiếp, rõ ràng là "xuất các lớp". Tuy nhiên, bạn sẽ có thể làm điều đó với một đơn giản C-giao diện:

#include "MyModule.h" 

// class MyModule inherits Module 

extern "C" Module * create_module() { return new MyModule; } 
extern "C" void free_module(Module * p) { delete p; } 

Bây giờ bạn có thể tự động tải thư viện đó và lấy các chức năng create_modulefree_module, và thêm chức năng gợi ý của họ tự động vào hệ thống của bạn:

std::map<std::string, std::pair<Module * (*)(), void(*)(Module *)> plugins; 

plugins["MyClass"] = std::make_pair(..., ...); // the dynamically resolved 
               // function addresses 

Thực tế, có thể bạn thậm chí không cần hàm hủy, vì máy ảo phá hủy thông thường sẽ hoạt động ngay cả trong các thư viện được nạp động.

Ví dụ:

std::unique_ptr<Module> make_module(std::string const & s) 
{ 
    auto it = plugins.find(s); 

    return { it == plugins.end() ? nullptr : it->second.first() }; 
} 
Các vấn đề liên quan