2010-04-08 10 views
4

Comment puis-je masquer la mise en œuvre privée (partage implicite) dans Qt:Puis-je utiliser QSharedData en héritant de QObject?

J'ai Employee.cpp ce qui suit dans mon en-tête 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; 
}; 

Mais quand je me déplace EmployeeData à une partie privée , dire Employee.cpp je reçois: erreur: utilisation non valide de type incomplet 'struct EmployeeData'

Cependant, si je change ma définition de cela, il fonctionne très bien:

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

Ainsi, puis-je utiliser QSharedData en héritant de QObject?

Répondre

2

Thus, can I use QSharedData while inheriting from QObject ?

Vous ne pouvez pas hériter de QObject lors de l'utilisation de QSharedData. QSharedData utilise la sémantique copy-on-write et appelle le detach() pour créer une copie des données lorsqu'il n'est plus partagé. Afin de faire la copie, un constructeur de copie est nécessaire, ce que QObject ne supporte pas.

Le pimpl (ou handle-body/opaque-pointer idiom) donnera souvent à la classe de données une référence à l'implémentation publique, ce qui correspond à la façon dont vous devez travailler avec les signaux et les slots.

QSharedDataPointer fournit la plupart des détails de mise en œuvre, mais il est aussi très instructif de jeter un oeil à l'idiome de Pimpl tel qu'il est utilisé dans Qt (see Q_D and friends)

+0

Je ne vois nulle part dans la documentation 'QSharedDataPointer' comment vous pourriez stocker une référence à la classe publique. Vous avez le contrôle sur le constructeur de la copie, mais quand une copie est faite une référence au parent n'est pas transmise, donc à moins que la classe à laquelle les données sont maintenant attachées sache que 'detach()' a été appelée, elle ne peut pas Ne pas informer les données qu'il a un nouveau propriétaire. Pensées? Suggestions? Peut-être que vous auriez besoin de sous-classe 'QSharedDataPointer' pour soutenir une telle opération? –

+0

Darn, je voulais avoir mon gâteau et le manger aussi! Mon idée était d'avoir un objet de données (transfert) avec 1) des signaux et des slots, 2) pimpl ET 3) copy-on-write. Je suppose que pas de cloches et de sifflets et de vivre avec 2 et 3. Ou y at-il des suggestions à 1 + 2 + 3 en utilisant des classes Qt? –

+0

Comment vos connexions seraient-elles transférées/copiées lors de la copie de votre objet de données? Pourquoi avez-vous besoin de signaux/slots directement dans la classe de données? –