Пользовательские слабые/сильные опорные указатели

Я создаю свою собственную реализацию отношения слабого/сильного указателя ссылки, и я запутался в конфигурации. Когда у меня есть класс, содержащий сильную ссылку, и я хочу установить сильный указатель на другой класс, имеющий слабую ссылку, должен ли я передавать указатель слабого указателя?

Если кто-то может взглянуть на этот код и дайте мне знать, я его оценю, а также, если вы заметите какие-либо другие проблемы, пожалуйста, дайте мне знать. Я поместил эти три файла в файлы кодовой панели, чтобы эта страница не стала громоздкой.

WeakReference.h: http://codepad.org/nNtRk4vO

StrongReference.h: http://codepad.org/MGi0fZ4J

Пожалуйста, не превращайте это в аргумент «использовать boost, использовать std, использовать tr1», я ищу помощь по этому коду, а не использую что-то еще.


person chadb    schedule 14.03.2011    source источник
comment
main.cpp : codepad.org/nNtRk4vO (это нужно было сделать, потому что я новый пользователь)   -  person chadb    schedule 14.03.2011
comment
Это упражнение по программированию? Или, может быть, домашнее задание? Если нет, то почему бы не использовать то, что доступно в boost?   -  person Sam Miller    schedule 14.03.2011
comment
Это упражнение по программированию, я давно хотел научиться делать это, и мне нравится реализовывать много моих собственных вещей. Кто-то может назвать это излишним, потому что он уже есть, но я нахожу это забавным.   -  person chadb    schedule 14.03.2011
comment
совсем не лишнее, иногда это лучший способ научиться. Я спросил, потому что некоторые пользователи будут предлагать повышение без тега домашнего задания.   -  person Sam Miller    schedule 14.03.2011


Ответы (1)


Реализации, которые я видел и над которыми я работал, которые используют концепции сильной и слабой ссылки, используют два счетчика. Иногда один счетчик — это количество слабых ссылок, а другой — количество сильных. В других случаях один из счетчиков представляет собой сумму сильных и слабых ссылок. Иногда встречаются и другие схемы. Но я еще не видел реализации только с одним счетчиком, как у вас.

Возможно, было бы полезно, если бы вы написали спецификацию того, каким именно должно быть поведение для strong_ref и weak_ref. Я считаю, что процесс написания спецификации действительно может помочь в отладке реализации. Это заставляет вас думать о входных данных, выходных данных, крайних случаях, недопустимых случаях и т. д.

person Howard Hinnant    schedule 14.03.2011
comment
Когда я планировал это, я сделал небольшую спецификацию, и в основном это был просто подсчет ссылок. Для меня это сделано, так как иметь только один счетчик, так как у них должен быть только один strong_ref (принадлежащий тому, кто им владеет), а остальные должны быть weak_ref (те, кто зависит от него). Это типичные отношения? - person chadb; 14.03.2011
comment
В модели Shared/weak_ptr C++0x (и boost) Shared_ptr совместно владеет сконструированным состоянием объекта и распределением памяти, в которой находится объект. Слабые_ptr разделяют владение только выделенной памятью (с shared_ptrs). Если вы хотите сослаться через weak_ptr, вы должны сначала преобразовать его в shared_ptr, что может привести к сбою, если объект уже был уничтожен. - person Howard Hinnant; 14.03.2011