Я столкнулся с этой проблемой, работая в Qt, но типы не имеют значения; это общая форма языка C++, о которой я смущен.
Я хочу иметь
std::unique_ptr<QSqlDatabase> database;
Существует функция с этой сигнатурой
QSqlDatabase QSqlDatabase::addDatabase()
Я попытался сделать что-то вроде
database.reset(QSqlDatabase::addDatabase());
Конечно, это не удалось скомпилировать, потому что database
ожидает QSqlDatabase *
а вызов метода возвращает простую QSqlDatabase
. Что делать, если я хочу поместить возвращаемое значение addDatabase()
в unique_ptr
? Я застреваю, потому что я не использую кучу.
Итак, Локи, вероятно, прав, но вот ответ на ваш вопрос.
database.reset(new QSqlDatabase(QSqlDatabase::addDatabase()));
или
std::unique_ptr<QSqlDatabase> database(new QSqlDatabase(QSqlDatabase::addDatabase());
Любой из этих экземпляров приводит результат в выделенную кучей QSqlDatabase.
Вы не хотите этого делать:
int work()
{
QSqlDatabase DB = QSqlDatabase::addDatabase();
} // DB goes out of scope here and is destroyed automatically.
auto database = QSqlDatabase::addDatabase();
? Для чего нужен указатель?unique_ptr
для управления им?