gpt4 book ai didi

c++ - 在 MySQL Connector 中使用智能指针

转载 作者:行者123 更新时间:2023-11-30 05:32:07 37 4
gpt4 key购买 nike

大多数与 mysql 连接器库相关的教程都假设用户将使用原始指针。我想改用智能指针。我写了以下类(class):

class Database{
private:
bool _connected = false;
std::shared_ptr<sql::Driver> _driver;
std::shared_ptr<sql::Connection> _connection;
std::shared_ptr<sql::Statement> _statement;
std::shared_ptr<sql::ResultSet> _resource;
public:
Database();
~Database();
bool connect(const std::string &ip, const std::string &user, const std::string password);
bool connected();
};

我正在尝试实现 connect 函数,但在编译期间收到以下错误:

/usr/include/c++/5.3.0/ext/new_allocator.h:120:4: error: invalid new-expression of abstract class type ‘sql::Driver’
{ ::new((void *)__p) _Up(std::forward<_Args>(__args)...); }

是由下面一行代码引起的:

this->_driver = std::make_shared<sql::Driver>(get_driver_instance());

我做错了什么?我发现了几个使用智能指针的示例,但在每个示例中,sql::Driver 实例都是原始指针。难道不能将get_driver_instance()函数的结果赋值给智能指针吗?

更新:

我认为我应该使用reset 函数而不是make_shared 模板。不幸的是:

this->_driver.reset(get_driver_instance());

没有解决问题,我得到了这个错误:

/usr/include/cppconn/driver.h:39:10: error: ‘virtual sql::Driver::~Driver()’ is protected
virtual ~Driver() {}

我猜 shared_ptr 无法“声明”Driver 的析构函数,因为它是 protected (如错误中所述)。有什么解决方法吗?或者我应该在处理 sql::Driver 时简单地使用原始指针?

最佳答案

get_driver_instance() 生成的驱动程序对象指针是指向静态存储对象 AFAIK 的指针,并且该指针可能不会被deleted。所以你不需要智能指针来管理它的生命周期。静态对象在程序结束时被销毁。您帖子中的其他对象(sql::Connectionsql::Statementsql::ResultSet)需要删除所以你可以使用智能指针来管理它们。

关于c++ - 在 MySQL Connector 中使用智能指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35260452/

37 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com