2016-02-07 3 views
1

Большинство учебников, связанных с библиотеками соединителей 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?

ответ

1

Результирующий указатель на указатель объекта от get_driver_instance() является указателем на статический объект хранения AFAIK, и этот указатель может не быть delete d. Поэтому вам не нужен умный указатель для управления временем жизни. Статические объекты уничтожаются, когда программа заканчивается. Другие объекты в вашем сообщении (sql::Connection, sql::Statement, sql::ResultSet) необходимо удалить , чтобы вы могли использовать интеллектуальный указатель для управления этими.

+0

Спасибо. Я не заметил, что действительно никто не удаляет указатель драйвера в своих примерах. –

Смежные вопросы