Bạn có thể thử sử dụng "typeid".
Điều này không hoạt động đối với tên "đối tượng" nhưng bạn biết tên đối tượng để bạn chỉ phải lưu trữ ở đâu đó. Trình biên dịch không quan tâm đến những gì bạn đã đặt tên cho một đối tượng. Tuy nhiên,
Mặc dù vậy, đầu ra của typeid là một trình biên dịch cụ thể nên ngay cả khi nó tạo ra những gì bạn đang có trên nền tảng hiện tại, nó có thể không xuất hiện trên nền tảng khác. Điều này có thể hoặc không có thể là một vấn đề cho bạn.
Giải pháp khác là tạo một số loại trình bao bọc mẫu mà bạn lưu trữ tên lớp. Sau đó, bạn cần sử dụng chuyên môn từng phần để làm cho nó trả lại tên lớp chính xác cho bạn. Điều này có lợi thế về thời gian biên dịch làm việc nhưng phức tạp hơn nhiều.
Chỉnh sửa: Là rõ ràng hơn
template< typename Type > class ClassName
{
public:
static std::string name()
{
return "Unknown";
}
};
Sau đó cho mỗi somethign lớp liek sau:
template<> class ClassName<MyClass>
{
public:
static std::string name()
{
return "MyClass";
}
};
Mà thậm chí có thể được macro'd như sau:
#define DefineClassName(className) \
\
template<> class ClassName<className> \
{ \
public: \
static std::string name() \
{ \
return #className; \
} \
}; \
phép bạn, chỉ cần làm,
DefineClassName(MyClass);
Tính năng cuối cùng Lấy tên lớp bạn muốn làm như sau:
ClassName<MyClass>::name();
Edit2: Xây dựng thêm sau đó bạn sẽ cần phải đặt này "DefineClassName" vĩ mô trong mỗi lớp bạn thực hiện và xác định một " classname "function sẽ gọi hàm tĩnh template.
Edit3: Và suy nghĩ về nó ... gửi bài điều đầu tiên rõ ràng là xấu của nó vào buổi sáng khi bạn có thể cũng chỉ định nghĩa một hàm thành viên "classname()" như sau:
std::string classname()
{
return "MyClass";
}
có thể được macro'd như sau:
DefineClassName(className) \
std::string classname() \
{ \
return #className; \
}
sau đó, bạn có thể đơn giản chỉ cần thả
DefineClassName(MyClass);
vào cl ass như bạn xác định nó ...
Tôi đang bối rối. Bạn có liên quan đến C++ 'class' với một" lớp học sinh "không? Nếu bạn có một 'lớp' đại diện cho một lớp, và lớp đó có tên như" Mẫu giáo của bà Gutentag ", nó phải có một thành viên dữ liệu để lưu trữ nó như là một' std :: string'. – Potatoswatter
@Potatoswatter: Bây giờ, tôi bối rối. Bạn hỏi gì? – Lazer
Có hai nghĩa của từ "class" và loại lớp có sinh viên không phải là từ khóa 'class' đề cập đến. – Potatoswatter