返回实例导致"尝试引用已删除的函数"错误
Return instance causes 'attempting to reference a deleted function' error
在过去的一二十年里,我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
删除了它的复制构造函数,因此您无法按值返回它。您可以改为从ExecuteSqlQuery
返回std::unique_ptr<CRecordset>
或引用。
删除复制构造函数时:https://stackoverflow.com/a/6077164/2449857
关于从函数返回引用:返回C++引用变量的做法是邪恶的吗?
相关文章:
- 析构函数删除错误的元素
- LinkedList removePosition 删除错误的元素
- 如何在为类创建 .h 和 .cpp 文件后删除错误?C++
- 使用C++类时出现巨大的删除错误
- C++解释此删除[]错误
- shared_ptr C++出现双重删除错误
- 如何删除错误:"." 标记之前的预期主表达式
- DoublyLinkedList删除错误
- 我使用构造函数(使用内存 Dinamic char *t = 新字符 [10] t = "test123456" ;))时遇到错误堆错误并在析构函数中删除 [] t;错误
- 分配字符串时出现 char* 新建和删除 [] 错误
- C++模板代码导致在显然未正确分配的对象上调用删除错误
- C++删除错误
- c++ STL删除错误
- 从二叉树中删除错误
- 矢量擦除函数删除错误的对象
- 二进制结构删除错误
- 如何从FLANNBASED匹配器在OPENCV中删除错误的匹配
- map删除错误的元素
- 使用 std::删除删除错误的字符
- c++ pair删除错误