ОК, я начал использовать общие-указатели и максимально передавать общие-указатели. Нет преобразования в сырые указатели больше. Это хорошо работает, за исключением этого конкретного случая:
Предположим, у нас есть класс, который также является наблюдателем для другого класса, например:
class MyClass : public IObserver
{
public:
MyClass (std::shared_ptr<SomeOtherClass> otherClass);
void DoSomethingImportant();
private:
std::shared_ptr<SomeOtherClass> m_otherClass;
};
Этот класс используется в моем приложении следующим образом:
std::shared_ptr<MyClass> myInstance(new MyClass(otherInstance));
...
myInstance->DoSomethingImportant();
MyClass получает разделяемый указатель на другой класс и сохраняет его в своем элементе данных m_otherClass.
В методе DoSomethingImportant экземпляр MyClass делает много важных вещей, включая регистрацию себя в качестве наблюдателя на m_otherClass, например:
m_otherClass-> registerObserver (это);
Проблема в том, что метод registerObserver определен так:
void registerObserver (наблюдатель std :: shared_ptr);
Ожидается общий указатель, но «this» является необработанным, а не общим указателем.
Я вижу три способа решения этой проблемы:
- Найдите трюк для преобразования обычного указателя в общий указатель (см. Вопрос преобразование указателя в shared_ptr ), но ответы на этот вопрос предлагают только скопировать указатели общего доступа, а не о том, как на самом деле преобразовать указатель в общий указатель.
- Передайте разделяемый указатель на себя методу, например: "myInstance-> DoSomethingImportant (myInstance);" что кажется немного глупым.
- Поместите часть наблюдателя в отдельный класс. Это выглядит как излишнее убийство и может усложнить понимание класса.
Эта проблема делает очевидным, что совместно используемые указатели являются просто дополнением к C ++ (я не думаю, что у вас есть такая же проблема в других языках / средах, таких как C # (или .Net в целом) и Java).
Любые другие предложения или хитрости о том, как справиться с этой ситуацией?