ОК, я начал использовать общие указатели и передавать общие указатели как можно больше. Больше не конвертировать в исходные указатели. Это работает хорошо, но в данном конкретном случае:shared_ptr и этот указатель
Предположим, у нас есть класс, который также является наблюдателем от другого класса, например:
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 (this);
Проблема заключается в том, что метод registerObserver определяется следующим образом:
недействительного registerObserver (станд :: shared_ptr наблюдателя);
Он ожидает общий указатель, но «это» - это необработанный указатель, а не общий.
Я вижу три пути решения этого:
- Найти трюк, чтобы преобразовать обычный указатель на общий указатель (см вопроса convert pointer to shared_ptr), но ответы на этот вопрос только предложить, чтобы скопировать общие-указатели , а не о том, как фактически преобразовать указатель в общий указатель.
- Передайте общий указатель на наш метод, например: «myInstance-> DoSomethingImportant (myInstance);» что кажется немного глупым.
- Поместите часть наблюдателя в отдельный класс. Это похоже на излишний, и может сделать класс труднее понять.
Эта проблема делает очевидным, что общие указатели - это просто дополнение к C++ (я не думаю, что у вас такая же проблема на других языках/средах, таких как C# (или .Net вообще) и Java).
Любые другие предложения или рекомендации по устранению этой ситуации?
Вы не можете использовать 'enable_shared_from_this'? (См. [Получение Boost shared_ptr из этого] (http://stackoverflow.com/questions/142391/getting-a-boostshared-ptr-for-this)) –
Кто это отрицает этот вопрос и все ответы? Неужели это такой глупый вопрос? – Patrick
Я иногда удивляюсь ... если некоторые люди просто не пытаются получить значок http://stackoverflow.com/badges/7/critic?userid=147192 –