Большинство учебников, связанных с библиотеками соединителей mysql, предполагают, что пользователь будет использовать необработанные указатели. Вместо этого я бы хотел использовать интеллектуальные указатели. Я написал следующий класс:Использование интеллектуальных указателей с соединителем 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()
интеллектуальному указателю?
Update:
Я думаю, что я должен использовать функцию 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
?
Спасибо. Я не заметил, что действительно никто не удаляет указатель драйвера в своих примерах. –