C ++, как использовать умный указатель

0

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

Ситуация такова:

class myClass: public xNS::aClass
{
   private:
      xClass& mysmp;

   public:
      myClass();
      virtual ~myClass();

      /* method inherited */
      void foo(bClass& xsmp);
}

И это то, что я хотел бы сделать в методе foo:

void myClass::foo(bClass& xsmp)
{
   mysmp = xsmp;
}

Я попытался решить, используя список инициализаторов членов так:

myClass()::myClass() : mysmp(NULL)
{
   /* ... */
}

Но я понимаю, что это невозможно, поскольку компилятор возвращает ошибку. Как я могу решить свою проблему?

Если это может быть полезно, я использую g++.

Заранее благодарю вас за ваши предложения.

  • 4
    Это не умный указатель, это ссылка. И вы не можете оставить ссылку неопределенной, и вы не можете изменить ее позже.
  • 1
    Кажется, вы хотите инициализировать указатель на ноль, а не сохранять его неинициализированным. Но в вашем классе нет указателей, умных или нет. Он содержит справочный mysmp . Ссылки не могут быть неинициализированы или иметь нулевое значение.
Показать ещё 3 комментария
Теги:
smart-pointers

2 ответа

2
Лучший ответ

Во-первых, пусть что-то прояснит:

xClass & mysmp не является указателем. Это даже не умный указатель. Амперсанд (&) после типа в объявлении переменной означает, что он является ссылкой.

xClass означает, что mysmp должен ссылаться на существующий экземпляр xClass. Он может не ссылаться на NULL. Он также не может ссылаться ни на что; он должен быть инициализирован чем-то, на что можно ссылаться. Кроме того, ссылки не могут быть изменены, чтобы ссылаться на другой экземпляр после того, как они уже были назначены.

При этом, если вы все еще хотите использовать ссылку, вы можете инициализировать ее в списке инициализаторов конструктора следующим образом:

myClass::myClass(xClass& xsmp) : mysmp(xsmp)
{
   /* ... */
}

Если в вашем дизайне имеет смысл, что mysmp может быть нулевым, вы можете использовать необработанный или (желательно) умный указатель, например std :: unique_ptr

// ...
std::unique_ptr<xClass> mysmp;
// ...

Уникальный_ptr инициализируется, чтобы по умолчанию указывать на ничего (nullptr), поэтому нет необходимости явно устанавливать его в значение null в конструкторе myClass.

  • 1
    : mysmp (nullptr) является избыточным
  • 0
    Спасибо за упоминание этого поля :) Я отредактирую свой ответ.
2

Вам нужна переменная, значение которой является ссылкой. К счастью, reference_wrapper существует именно для этой цели.

  • 1
    C ++ 11 просто полон сюрпризов. К сожалению, это не идеальная замена для справки, вы не можете переопределить operator. ,
  • 0
    Может ли downvoter объяснить, чтобы ответ был исправлен / улучшен?
Показать ещё 4 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню