2009-11-07 22 views
6

Tôi muốn đăng ký các lớp học của mình trong một số std::map hoặc một véc tơ, đừng nghĩ về các bản sao và như vậy bây giờ, nhưng tôi không muốn đăng ký nó trong gọi hàm dựng lớp hoặc bất kỳ hàm nào trong hàm của lớp, bằng cách nào đó thực hiện nó bên ngoài lớp, vì vậy ngay cả khi tôi không bao giờ khởi tạo nó, tôi có thể biết rằng nó tồn tại.Bằng cách nào đó đăng ký các lớp học của tôi trong danh sách

Ví dụ:

// Somehow, from outside the myclass, in a scope that will be called 
//in the begining of the proccess, add "MyClass1" to a 
//list so it can be instanciated later 
class MyClass1{ 

} 

Sau đó, tôi sẽ làm cho một #define của nó hoặc nếu có thể, một bản mẫu.
Tôi không biết liệu mình có làm rõ ràng hay không ... Quan điểm của tôi là tôi cần phải biết mọi lớp học mà tôi có mà không cần phải gọi mỗi và từng lớp.
Ý tưởng của tôi là tạo ra một #define để làm cho nó dễ dàng hơn để khai báo tiêu đề của lớp và gọi một cái gì đó sẽ đăng ký mà lớp học cụ thể vào một danh sách

này có thể được thực hiện hoặc tôi sẽ phải để ánh xạ nó bằng tay?

// desirable: 
#define CLASSREGISTER(myclass) makethemagic(##myclass); class myclass { 
}; 

tôi biết, với định nghĩa tôi không thể sử dụng thừa kế vv ... Quan điểm của tôi là cố gắng đưa ra một ví dụ về những gì tôi đã suy nghĩ để tạo ra bằng cách nào đó ...

+0

Tôi nghĩ bạn nên thêm thẻ 'mẫu thiết kế'. – Alexandru

Trả lời

9

Đây là phương pháp để đặt tên lớp bên trong một vectơ. Để lại một bình luận nếu tôi bỏ lỡ các chi tiết quan trọng. Tôi không nghĩ rằng nó sẽ làm việc cho các mẫu, mặc dù.

struct MyClasses { 
    static vector<string> myclasses; 
    MyClasses(string name) { myclasses.push_back(name); } 
}; 

#define REGISTER_CLASS(cls) static MyClasses myclass_##cls(#cls); 

struct XYZ { 
}; 

REGISTER_CLASS(XYZ); 

Bí quyết ở đây là thực hiện một số tính toán trước khi gọi hàm main() và bạn có thể đạt được điều này thông qua khởi tạo toàn cục. REGISTER_CLASS (cls) thực sự tạo mã để gọi hàm tạo của MyClasses khi khởi động chương trình.

CẬP NHẬT: Tiếp theo đề nghị gf bạn có thể viết này:

#define REGISTER_CLASS(cls) temp_##cls; static MyClasses myclass_##cls(#cls); class cls 
class REGISTER_CLASS(XYZ) { int x, y, z; } 
+0

Xin lỗi, nhưng tôi không hiểu ... tôi sẽ làm thế nào để khai báo lớp học với mã của bạn? – Jonathan

+0

ngoại trừ std :: string/string – ScottJ

+0

@ Jonathan: đăng ví dụ về XYZ. Đây có phải là điều bạn muốn không? – Alexandru

-2

Sử dụng boost :: mpl, vector hoặc bản đồ.

Các vấn đề liên quan