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?
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? –
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? –
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? –