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)
даже достигнуто. У меня есть два вопроса:
- Нужно ли использовать указатель в этом случае?
- Как я могу использовать
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);