C++ unique_ptr отдельное объявление и создание экземпляра

Может быть, это очень простой вопрос. Но как программист на Java, я все еще пытаюсь понять, как правильно создавать объекты в C++. Я получил переменную-член в своем классе и не могу создать ее экземпляр в списке экземпляров конструктора класса (потому что это зависит от некоторых значений конфигурации):

class SomeClass{    
  private:
  ObjectType mObject; //declaration and instantiation??

  public: 
  SomeClass()/*:mObject(valueA,valueB)*/{ 
     //read config here...
     //now we got valueA and valueB
     mObject = mObject(valueA,valueB);
  }    
};

Код, показанный выше, не работает, потому что C++ пытается вызвать mObject() до mObject(valueA, valueB) даже достигнуто. У меня есть два вопроса:

  1. Нужно ли использовать указатель в этом случае?
  2. Как я могу использовать unique_ptr за это? Я уже искал примеры, но не нашел ни одного с отдельным объявлением и созданием экземпляра. (как здесь)

Я получаю сообщение об ошибке, если я пытаюсь использовать unique_ptr как это:

 #include <memory>
  class SomeClass{    
      private:
      std::unique_ptr<ObjectType> mObject;

      public: 
      SomeClass(){ 
         //read config here...
         //now we got valueA and valueB
         mObject = new ObjectType(valueA,valueB);
      }    
    };

Ошибка:

Ошибка: нет совпадения для 'operator=' (типы операндов: 'std::unique_ptr' и 'ObjectType*') mObject= new ObjectType(valueA, valueB)

Может быть, есть даже лучшее решение, которого я еще не видел.

2 ответа

Решение

Вы можете установить значение unique_pointer следующим образом:

mObject.reset(new ObjectType(valueA,valueB));

Проверьте документы здесь: http://www.cplusplus.com/reference/memory/unique_ptr/reset/

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

private:
static std::pair<A, B> readConfig();
SomeClass(std::pair<A, B> p) : mObject(p.first, p.second) {}
public:
SomeClass() : SomeClass(readConfig()) {}

Это дает ряд преимуществ, например:

  • Вы будете точно знать, что ObjectType объект действительно будет жить до тех пор, пока SomeClass объект жизни; нет никакого шанса случайно уничтожить его раньше.
  • Если SomeClass объект constВы избегаете случайного изменения ObjectType объект. std::unique_ptr член будет иметь "мелкий constСемантика

Если вы действительно хотите сделать mObject std::unique_ptr тогда вот два пути:

mObject.reset(new ObjectType(valueA, valueB));

а также

mObject = std::make_unique<ObjectType>(valueA, valueB);
Другие вопросы по тегам