So, in my case, i would do something like this (similar to the Employee example):
public:
// data members here
int member1;
// ...
MyObjectData(const MyObjectData &other) : // copy contstructor
member1(other.member1),
member2(other.member2) {
}
};
Q_OBJECT
private:
QExplicitlySharedDataPointer<MyObject> d;
public:
MyObject() { d = new MyObjectData(); }
MyObject(const MyObject &other) : d (other.d) {}
int getMember1() const { return d->member1; }
QString getMember2
() const { return d
->member2;
} void setMember1(int i) { d->member1 = i; }
void setMember2
(QString s
) { d
->member2
= s;
} };
class MyObjectData : public QSharedData {
public:
// data members here
int member1;
QString member2;
// ...
MyObjectData(const MyObjectData &other) : // copy contstructor
QSharedData(other),
member1(other.member1),
member2(other.member2) {
}
};
class MyObject : public QObject {
Q_OBJECT
private:
QExplicitlySharedDataPointer<MyObject> d;
public:
MyObject() { d = new MyObjectData(); }
MyObject(const MyObject &other) : d (other.d) {}
int getMember1() const { return d->member1; }
QString getMember2() const { return d->member2; }
void setMember1(int i) { d->member1 = i; }
void setMember2(QString s) { d->member2 = s; }
};
To copy to clipboard, switch view to plain text mode
But i also have some subclasses, so i suppose i would do this:
class SubClassData : public MyObjectData {
public:
// more data members
float subclassMember1;
bool subclassMember2;
// ...
SubClassData(const SubClassData &other) :
MyObjectData(other),
member1(other.member1),
member2(other.member2) {
}
};
class SubClass : public MyObject {
Q_OBJECT
public:
SubClass() { d = new SubClassData(); }
SubClass(const SubClass &other) : d (other.d) {}
int getSubclassMember1() const { return d->subclassMember1; }
QString getSubclassMember2
() const { return d
->subclassMember2;
} void setSubclassMember1(int i) { d->subclassMember1 = i; }
void setSubclassMember2
(QString s
) { d
->subclassMember2
= s;
} };
class SubClassData : public MyObjectData {
public:
// more data members
float subclassMember1;
bool subclassMember2;
// ...
SubClassData(const SubClassData &other) :
MyObjectData(other),
member1(other.member1),
member2(other.member2) {
}
};
class SubClass : public MyObject {
Q_OBJECT
public:
SubClass() { d = new SubClassData(); }
SubClass(const SubClass &other) : d (other.d) {}
int getSubclassMember1() const { return d->subclassMember1; }
QString getSubclassMember2() const { return d->subclassMember2; }
void setSubclassMember1(int i) { d->subclassMember1 = i; }
void setSubclassMember2(QString s) { d->subclassMember2 = s; }
};
To copy to clipboard, switch view to plain text mode
Then i would pass around these objects by value instead of passing a pointer to them.
That should solve the two questions i had earlier in this thread.
For connecting to signals, i could pass the address of the MyObject object:
MyObject object;
connect(&object, SIGNAL(updated()), something, SLOT(update()));
MyObject object;
connect(&object, SIGNAL(updated()), something, SLOT(update()));
To copy to clipboard, switch view to plain text mode
And for having the object create an instance of another object which takes a reference to the creator, i could do this:
AnotherObject* MyObject::makeAnotherObject() {
return new AnotherObject(*this);
}
// Note: AnotherObject does not need to be reference counted, so a raw pointer can be returned. The caller of this function will take ownership of it. (Perhaps not the best design, but in this case i am only calling this function from one place and i know where the objects are being used).
AnotherObject* MyObject::makeAnotherObject() {
return new AnotherObject(*this);
}
// Note: AnotherObject does not need to be reference counted, so a raw pointer can be returned. The caller of this function will take ownership of it. (Perhaps not the best design, but in this case i am only calling this function from one place and i know where the objects are being used).
To copy to clipboard, switch view to plain text mode
wysota, i would be interested to see how you would deal with this problem using QSharedPointer. It sounds like you would just do something similar to my example above, but replace QExplicitlySharedDataPointer with QSharedPointer and not have MyObjectData inherit from QSharedData. Is that right?
Bookmarks