I have a GUI to interact with the user, but I have an OOP design problem with this.
Through a dialog the user specifies CDiscreteDistribution
s and they are stored in a std::vector<CDiscreteDistribution*>
in the MyAppDoc
class for serialization. Through another dialog the user chooses a type of CDistribution
for a particular CParameter
. CDiscreteDistribution
, CConstantDistribution
, and CContinuousDistribution
inherit CDistribution
, and CParameter
has a polymorphic pointer to a CDistribution
member variable. MyAppDoc
has a container class of CParameter
. Thus the CDiscreteDistribution
s are pointed two twice, but only exist once.
In summary, MyAppDoc
has
std::vector<CDiscreteDistribution*>
CContainer
which has manyCParameter
which haveCDistribution*
which can point to one ofCDiscreteDistribution
which is one of theCDiscreteDistribution*
s stored aboveCConstantDistribution
created/destroyed byCParameter
CContinuousDistribution
created/destroyed byCParameter
This design pattern is causing me various nightmares in porting the app to use shared_ptr
due to double deletes and serialization (boost). Should one of the pointers to CDiscreteDistribution
be a weak_ptr
? If so where should own the pointer?
Thanks for any help!
EDIT:
I re-thought the reasoning for having std::vector<CDiscreteDistribution*>
and it was just to avoid copying the vector into and out of the GUI. But the objects are quite small, and so I've broken the link between them and suffer the minor performance implications. Now MyAppDoc
has:
std::vector<CDiscreteDistribution>
CContainer
which has manyCParameter
which haveCDistribution*
which can point to one ofCDiscreteDistribution
created/destroyed byCParameter
, copied from one of theCDiscreteDistribution
s stored aboveCConstantDistribution
created/destroyed byCParameter
CContinuousDistribution
created/destroyed byCParameter
I think part of the problem was boost::serialization
made two shared_ptr
s for each CDiscreteDistribution
that weren't aware of each other's existence. Now the only issue is backwards compatibility to files created with the previous versions.
I figure this 'solution' is actually just avoiding a proper design!