Вы объявляете класс с помощью метода, что неправильно
Вам необходимо понять, что на самом деле означают класс и метод (Google Java OOP):
1- Вы должны создайте класс и объявите переменные, которые вы хотите
2- создайте конструкторы для значений по умолчанию
3- сделайте установщики, чтобы установить (назначить) эти значения
4- сделайте геттеры читать эти значения
Я не нашел гораздо лучшего метода, чем рисование больших UML-графиков и поиск циклов.
Для отладки я использую счетчик экземпляров, идущий в реестр, например так:
template <DWORD id>
class CDbgInstCount
{
public:
#ifdef _DEBUG
CDbgInstCount() { reghelper.Add(id, 1); }
CDbgInstCount(CDbgInstCount const &) { reghelper.Add(id, 1); }
~CDbgInstCount() { reghelper.Add(id, -1); }
#else
#endif
};
Мне просто нужно добавить это к рассматриваемым классам, и посмотрите на реестр.
(Идентификатор, если дано, например, 'XYZ!', будет преобразован в строку. К сожалению, вы не можете указать строковую константу в качестве параметра шаблона )
shared_ptr
представляет право собственности отношение. В то время как слабый_птр
представляет осведомленность . Наличие нескольких объектов, владеющих друг другом, означает, что у вас есть проблемы с архитектурой, которая решается путем замены одного или нескольких собственных на с учетом (то есть, weak_ptr
s).
Я не понимаю, почему предложение weak_ptr
считается бесполезным.
Довольно просто обнаружить циклы:
Это, однако, не очень полезно. И, как правило, невозможно решить проблему цикличности для пересчитанных указателей - поэтому были изобретены альтернативные схемы сбора мусора, такие как очистка поколений.
Может быть, комбинация boost :: weak_ptr
и boost :: shared_ptr
? Эта статья может представлять интерес.
Общее решение найти цикл можно найти здесь:
Лучший алгоритм для проверки того, имеет ли связанный список цикл
. Предполагается, что вы знаете структуру объектов в списке и можете следовать всем указателям, содержащимся в каждом из них. объект.
I know you said "no weak_ptr" but why not? Having your head with a weak_ptr to tail, and tail with a weak_ptr to head will prevent the cycle.
Я понимаю ваше раздражение по поводу того, что мне бойко говорят использовать weak_ptr для разрыва циклических ссылок, и я почти чувствую гнев, когда мне говорят, что циклические ссылки - плохой стиль программирования.
Вы конкретно спрашиваете, как вы заметили циклические ссылки. Дело в том, что в сложном проекте некоторые ссылочные циклы являются косвенными и их трудно обнаружить.
Ответ заключается в том, что вы не должны делать ложных заявлений, которые делают вас уязвимыми для циклических ссылок. Я серьезно и критикую очень популярную практику - слепое использование shared_ptr для всего.
Вы должны четко понимать, какие указатели являются владельцами, а какие - наблюдателями.
Для владельцев используйте shared_ptr
Для наблюдателей используйте weak_ptr - все они, а не только те, которые, по вашему мнению, могут быть частью цикла. Конечно, вам нужно будет написать много кода для преобразования всех этих weak_ptr в shared_ptrs, когда вы захотите их использовать - Boost действительно не подходит для этой работы.