2010-11-21 35 views
10

Trong ứng dụng của tôi, tôi có hệ thống phân cấp lớp sau đây:Có thể trộn các lớp C++ có nguồn gốc từ mẫu với Q_OBJECT của Qt không?

class Word 
{ 
    ... 
} 

template <typename T> class Dictionary 
{ 
    ... 
}; 

class WordDictionary : public Dictionary<Word> 
{ 
    Q_OBJECT 

    ... 
} 

Lớp WordDictionary phân tích một cuốn từ điển mà phải mất một thời gian dài. Tôi đang chạy hàm phân tích cú pháp từ bên trong một chuỗi riêng biệt và tôi muốn nó có thể báo hiệu chuỗi GUI theo thời gian để cung cấp các cập nhật tiến trình dựa trên số dòng hiện tại đang được phân tích cú pháp. Đó là lý do tại sao tôi muốn nó là một Q_OBJECT. Tôi đã cố gắng để làm cho các lớp cơ sở từ điển một Q_OBJECT nhưng có một thông báo rằng Q_OBJECT mẫu không được hỗ trợ. Khi tôi gỡ bỏ vĩ mô, chỉ để lại WordDictionary như Q_OBJECT, tôi nhận được một loạt các thông báo lỗi có dạng tổng quát:

\ GeneratedFiles \ phát hành \ moc_dictionary.cpp (44):. Lỗi C2039: 'staticMetaObject': không phải là thành viên của 'từ điển'
với
[
T = Lời
]

có bất cứ điều gì tôi có thể làm để làm cho mẫu có nguồn gốc từ lớp WordDictionary tôi một Q_OBJECT khác hơn là thể xác định rõ chức năng template trong bên cạnh nó, sản xuất rất nhiều mã boilerplate?

chỉnh sửa: Thay đổi tờ khai mẫu để:

template <typename T> class Dictionary : public QObject 

làm biên dịch mã. Tôi không chắc chắn nếu tôi không làm điều gì đó ngu ngốc và nếu điều này sẽ làm việc một cách chính xác, mặc dù.

+0

[Tại sao Qt không sử dụng mẫu cho tín hiệu và vị trí] (http://qt-project.org/doc/qt-4.8/templates.html) –

Trả lời

14

Bạn không thể thực hiện việc này trực tiếp nhưng có thể sử dụng các vòng làm việc có thể sử dụng. Xem bài viết here.

Trong khi đó là trên lý thuyết có thể cho moc để xử lý mẫu, nó sẽ là vô cùng phức tạp để thực hiện, và sẽ rất không thực tế để sử dụng: Đối với mỗi mẫu instantiation, moc sẽ phải tạo ra thích hợp đang meta-đối tượng, và tạo ra mã sẽ phải được bao gồm một lần mỗi đơn vị liên kết --- mà trở thành một cơn ác mộng để duy trì một lần một mẫu lớp được sử dụng với cùng một tham số mẫu trong biên soạn khác nhau các đơn vị.

Nếu các tín hiệu và khe cắm không đòi hỏi tham số mẫu là một phần của nguyên mẫu, thực hiện giải pháp là để làm cho một lớp mẫu kế thừa một lớp con QObject cung cấp các tín hiệu và khe yêu cầu. Nếu các tín hiệu và vị trí cần sử dụng thông số mẫu , mẫu Observer là một thay thế.

2

Tôi chỉ cố gắng mã này và nó biên dịch và chạy ok:

#include <QtCore/QCoreApplication> 
#include <QObject> 

class Word 
{ 

}; 

template <typename T> class Dictionary 
{ 

}; 

class WordDictionary : public Dictionary<Word>, QObject 
{ 
    Q_OBJECT 
}; 

int main(int argc, char *argv[]) 
{ 
    QCoreApplication a(argc, argv); 
    WordDictionary wd(); 
    return a.exec(); 
} 

Có thể là tôi đang thiếu cái gì?

+0

Điều này có thể tạo sự cố xuống dòng, hãy xem bài viết Tôi đã trích dẫn một cuộc thảo luận. –

+0

@Steve: Vấn đề gì xảy ra? Bài báo được trích dẫn chỉ thảo luận về việc cố gắng lấy mẫu lớp từ QObject. Điều này là tạo ra một lớp từ một cá thể mẫu và một QObject. Vấn đề duy nhất tôi thấy với điều này là QObject nên được đầu tiên trong danh sách thừa kế kể từ khi moc giả định rằng lớp kế thừa đầu tiên là một lớp con của QObject. – baysmith

+3

Không nên QObject là lớp cơ sở đầu tiên? – zarzych

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