После работы с 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 &) ‘: попытка сослаться на удаленную функцию
Может ли кто-нибудь помочь мне понять, что именно здесь происходит?
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)
{
...
}
CRecordset
удалил свой конструктор копирования, поэтому вы не можете вернуть его по значению. Вы могли бы вернуть std::unique_ptr<CRecordset>
или ссылка от ExecuteSqlQuery
вместо.
При удалении конструкторов копирования: https://stackoverflow.com/a/6077164/2449857
При возврате ссылок из функций: Является ли практика возврата ссылочной переменной C ++ злой?