将智能指针与 MySQL 连接器结合使用
Using smart pointers with MySQL Connector
大多数
与mysql连接器库相关的教程都假设用户将使用原始指针。我想改用智能指针。我写了以下类:
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
无法"声明"驱动程序的析构函数,因为它受到保护(如错误中所述(。有什么解决方法吗?或者也许我应该在处理sql::Driver
时简单地使用原始指针?
从 get_driver_instance()
生成的驱动程序对象指针是指向静态存储对象 AFAIK 的指针,该指针可能不是 d delete
。因此,您不需要智能指针来管理其生命周期。程序结束时,静态对象将被销毁。帖子中的其他对象(sql::Connection
、sql::Statement
、sql::ResultSet
(需要删除因此,您可以使用智能指针来管理这些内容。
相关文章:
- 多态性和功能结合
- 使用cmake从源代码构建MySQL连接器/C++失败(与以前的声明冲突)
- 使用mysql c++连接器的未定义引用
- 将 Vulkan 与 SFML 结合使用?
- MySQL C++连接器链接错误
- C++ boost::asio::ip::tcp::acceptor 有时不接受连接器?
- 将 c++ 生成器应用程序与外部 dll 结合使用
- C++MySQL连接器没有utf8
- 如何将增强MSM与增强信号结合使用?
- 如何在连接器 C++ 中将原始字节转换为字符串
- MS Visual Studio 解决方案结合了非托管C++项目和 C# 项目
- 函数未在作用域中声明 / 如何结合使用 header.h、header.cpp 和 main.cpp?
- 将预编译的 C 共享库与 JNI/NDK 结合使用
- MySQL 连接器/C++.尝试在此过程中停止连接到数据库
- 获取具有字段名称的 SELECT 字段类型,并带有 MariaDB C++连接器
- C++ 将函数指针与最佳性能相结合
- 将 Lua 与 C++ DLL 结合使用
- 为什么push_back和emplace_back结合在一起时,会有不同的行为
- 将 aws-iot-device-sdk-cpp-v2 与 CMake 结合使用
- 将智能指针与 MySQL 连接器结合使用