Возврат экземпляра вызывает ошибку «попытка ссылки на удаленную функцию»

После работы с C # в течение последних десяти или двух лет мой C ++ стал немного ржавым.

Я пишу класс базы данных и у меня проблема со следующим методом:

CRecordset CAccessDatabaseReader::ExecuteSqlQuery(LPCTSTR pszSqlQuery)
{
CRecordset recordSet(&m_Database);
recordSet.Open(CRecordset::forwardOnly, pszSqlQuery);
return CRecordset(recordSet);
}

Компилятор жалуется на строку с return заявление:

Ошибка C2280 ‘CRecordset :: CRecordset (const CRecordset &) ‘: попытка сослаться на удаленную функцию

Может ли кто-нибудь помочь мне понять, что именно здесь происходит?

0

Решение

CRecordsetконструктор копирования был явно помечен как deleted предотвратить копирование CRecordset объекты от одного к другому.

Таким образом, функция должна будет возвращать новый объект по указателю и требовать от вызывающего delete объект, когда закончил использовать его:

CRecordset* CAccessDatabaseReader::ExecuteSqlQuery(LPCTSTR pszSqlQuery)
{
CRecordset *recordSet = new CRecordset(&m_Database);
if (!recordSet->Open(CRecordset::forwardOnly, pszSqlQuery))
{
delete recordSet;
return NULL; // or raise an exception
}
return recordSet;
}

CRecordset *rs = reader.ExecuteSqlQuery(TEXT("..."));
if (rs)
{
...
delete rs;
}

Или лучше:

std::unique_ptr<CRecordset> CAccessDatabaseReader::ExecuteSqlQuery(LPCTSTR pszSqlQuery)
{
std::unique_ptr<CRecordset> recordSet(new CRecordset(&m_Database));
if (!recordSet->Open(CRecordset::forwardOnly, pszSqlQuery))
recordSet.reset(); // or raise an exception
return recordSet;
}

std::unique_ptr<CRecordset> rs = reader.ExecuteSqlQuery(TEXT("..."));
if (rs)
{
...
}
1

Другие решения

CRecordset удалил свой конструктор копирования, поэтому вы не можете вернуть его по значению. Вы могли бы вернуть std::unique_ptr<CRecordset> или ссылка от ExecuteSqlQuery вместо.

При удалении конструкторов копирования: https://stackoverflow.com/a/6077164/2449857

При возврате ссылок из функций: Является ли практика возврата ссылочной переменной C ++ злой?

1

По вопросам рекламы [email protected]