У меня есть графический интерфейс для взаимодействия с пользователем, но у меня возникла проблема с дизайном ООП.
Через диалоговое окно пользователь указывает CDiscreteDistribution
s, и они сохраняются в std::vector<CDiscreteDistribution*>
в классе MyAppDoc
для сериализации. Через другое диалоговое окно пользователь выбирает тип CDistribution
для конкретного CParameter
. CDiscreteDistribution
, CConstantDistribution
и CContinuousDistribution
наследуют CDistribution
, а CParameter
имеет полиморфный указатель на переменную-член CDistribution
. MyAppDoc
имеет класс контейнера CParameter
. Таким образом, CDiscreteDistribution
указывают два дважды, но существуют только один раз.
В итоге, MyAppDoc
имеет
std::vector<CDiscreteDistribution*>
CContainer
, который имеет много CParameter
, которые имеют
CDistribution*
, который может указывать на один из
CDiscreteDistribution
, который является одним из CDiscreteDistribution*
s, сохраненных выше
CConstantDistribution
создано / уничтожено CParameter
CContinuousDistribution
создано / уничтожено CParameter
Этот шаблон проектирования вызывает у меня различные кошмары при портировании приложения на использование shared_ptr
из-за двойного удаления и сериализации (повышение). Должен ли один из указателей на CDiscreteDistribution
быть weak_ptr
? Если да, то где должен принадлежать указатель?
Спасибо за любую помощь!
EDIT:
Я переосмыслил причину наличия std::vector<CDiscreteDistribution*>
, и это было просто для того, чтобы избежать копирования вектора в и из GUI. Но объекты довольно маленькие, и поэтому я разорвал связь между ними и перенес незначительные последствия для производительности. Теперь MyAppDoc
имеет:
std::vector<CDiscreteDistribution>
CContainer
, который имеет много CParameter
, которые имеют
CDistribution*
, который может указывать на один из
CDiscreteDistribution
создано / уничтожено CParameter
, скопировано с одного из CDiscreteDistribution
х, хранящихся выше
CConstantDistribution
создано / уничтожено CParameter
CContinuousDistribution
создано / уничтожено CParameter
Я думаю, что часть проблемы заключалась в том, что boost::serialization
сделал два shared_ptr
с для каждого CDiscreteDistribution
, которые не знали о существовании друг друга. Теперь единственной проблемой является обратная совместимость с файлами, созданными в предыдущих версиях.
Я полагаю, что это "решение" на самом деле просто избегает правильного дизайна!