Контекст:Каков правильный способ реализации агрегирования в современном C++?
Это является общим, что возникает ситуация, в которой я требую агрегации: Объект использовать другой объект, не имея его. То есть, некоторый основной модуль будет создавать и совместно использовать объект для/для других.
Однако до сих пор я не нашел правильный способ его реализации.
Предыдущие исследования:
1) C-подобные указатели: Общий объект предоставляется в качестве указателя. Проблема в том, что программист правильно управляет порядком создания, совместного использования и удаления, который может легко переносить оборванные указатели.
int main()
{
A a;
B b(&a);
return 0;
}
2) Слабые указатели: Использование общий/слабый указатель решить проблему оборванных указателей. Основная проблема заключается в том, что он избегает использования стековых объектов. Он также ретранслирует на исключениях, которые в лучшем случае являются полемикой, в худшем случае просто невозможно (код ядра/низкого уровня).
int main()
{
std::shared_ptr<A> a(new A());
std::weak_ptr<A> wa = a; // optional, but required to show the weak_ptr use
B b(wa);
}
3) Общие указатели: Использование только общий указатель имеет ту же проблему, чем (2), но кроме того, владение A неизвестно: что сломать несколько руководящих принципов дизайна.
4) Ссылка на объект: Публикация ссылки на объект решает проблему оборванности и, вероятно, является самым простым решением. С другой стороны, это заставляет агрегированный объект передаваться в конструкторе, он избегает операторов присваивания и вообще ограничивает дизайн.
int main()
{
A a;
B(a);
}
5) Никогда не объединяйте, просто передайте в качестве аргумента. Даже если это возможно, это значительно увеличивает количество параметров для некоторых функций. Это, на мой взгляд, слишком большая сложность.
6) Singleton pattern Singleton позволяет получить доступ к одному объекту из нескольких модулей. Но это позволяет только одному экземпляру делиться, и это противоречит нескольким строкам проектирования.
Вопрос:
Что такое правильный способ реализации агрегации в современном C++?
Идеальные цели были бы:
- сделать легко поддерживать код, и избежать ошибок.
- Гибкость в использовании по-разному (например, стек/куча)
- Не слишком много дополнительной сложности или неясного кода.
Не думаю, что здесь достаточно информации, чтобы ответить на вопрос. Это зависит от более архитектурных соображений, чем вы разделили. Все это допустимые варианты в зависимости от других вещей, хотя в «современном» C++ вы предпочитаете не использовать необработанные указатели, если это возможно (а также не нужно использовать «новый» в большинстве случаев) – johnbakers
Нет ни одного True Ответ. Выберите лучший дизайн, чтобы решить вашу конкретную проблему. –
Почему B не принадлежит A? У вас есть пользовательский сборщик мусора, чтобы вернуть кучу? Ожидает ли A? – vegi