2010-04-08 74 views
4

如何隱藏私人實施的Qt(隱式共享):我可以在從QObject繼承的同時使用QSharedData嗎?

我有Employee.cpp我Employee.h頭以下:

#include <QSharedData> 
#include <QString> 


class EmployeeData; 
class Employee: public QObject 
{ 
    Q_OBJECT 
    public: 
    Employee(); 
    Employee(int id, QString name); 
    Employee(const Employee &other); 
    void setId(int id); 
    void setName(QString name); 

    int id(); 
    QString name(); 

private: 
    QSharedDataPointer<EmployeeData> d; 
}; 

class EmployeeData : public QSharedData 
{ 
    public: 
    EmployeeData() : id(-1) { name.clear(); } 
    EmployeeData(const EmployeeData &other) 
     : QSharedData(other), id(other.id), name(other.name) { } 
    ~EmployeeData() { } 

    int id; 
    QString name; 
}; 

但是當我移動到EmployeeData工作私處,說E​​mployee.cpp我得到: 錯誤:無效的使用不完全類型的「結構EmployeeData工作」

但是,如果我改變我的定義,這是正常工作:

class Employee 
{ 
public: 
    Employee(); 
    Employee(int id, QString name); 
.. 

因此,我可以在從QObject繼承的同時使用QSharedData嗎?

回答

2

Thus, can I use QSharedData while inheriting from QObject ?

使用QSharedData時無法從QObject繼承。 QSharedData使用copy-on-write語義,並將在不再共享數據時調用detach()來創建數據的副本。爲了完成複製,需要一個複製構造函數,該QObject不支持。

pimpl(或handle-body/opaque-pointer成語)通常會給數據類提供公共實現的引用,這是您如何使用信號和插槽。

QSharedDataPointer提供了大部分的實現細節,但它也是相當有益的看看PIMPL方法中使用的Qt(see Q_D and friends

+0

我沒有任何地方'QSharedDataPointer'文檔看你怎麼能存儲對公共類的引用。你可以控制拷貝構造函數,但是當拷貝被​​創建時,父對象的引用沒有被傳入,所以除非現在附加數據的類知道'detach()'被調用,否則不能不通知數據,它有一個新的所有者。思考?建議?也許你需要子類'QSharedDataPointer'來支持這樣的操作? – 2010-04-08 20:14:05

+0

該死的,我想吃我的蛋糕,也吃了!我的想法是擁有1)信號和插槽的數據(傳輸)對象,2)pimpl和3)寫時複製。我猜沒有花裏胡哨的東西,並且和2和3一起生活。還是有一些建議給使用Qt類的1 + 2 + 3? – 2010-04-08 20:45:37

+0

當您的數據對象被複制時,您的連接將如何傳輸/複製?爲什麼直接在數據類中需要信號/插槽? – 2010-04-08 20:50:43

相關問題