2016-09-06 2 views
3

У меня есть класс с указателем на соединение MySQL. Для этого указателя и соединения имеет смысл быть постоянным. Тем не менее, другие классы необходимо соединение так, один из способов борьбы с этим, чтобы иметь класс бытьДолжен ли я использовать shared_ptr или возвращать unique_ptr.get()?

class A { 
    std::unique_ptr <sql::Connection> conn; 

    public: 
    const sql::Connection* getConnection(); 
} 

Или варианты этого (например, возвращает ссылку или добавление const в разных местах, в декларации conn. Реализация из getConnection, как

const sql::Connection* A::getConnection() { 
    return conn.get(); 
} 

Я брожу однако, если я должен использовать вместо std::shared_ptr и возвращает копию указателя. В какой сценарий будет один выбрать любой подход?

+0

И что такое 'A'? Как другие классы имеют доступ к 'A'? – Galik

+0

'A' заботится о том, чтобы проверить, что база данных MySQL существует и может использоваться. Другие классы не имеют прямого доступа к 'A', а скорее нуждаются в соединении, управляемом' A', получая ссылку на 'conn' в качестве параметров в своих методах. –

ответ

3

Если ваше приложение разработано таким образом, что можно доказать, что SQL-соединение не может быть использовано после того, как экземпляр вашего объекта A выходит из области действия и уничтожается, то с использованием unique_ptr и получения базового указателя с использованием get() достаточно.

Если, с другой стороны, вполне возможно, что может возникнуть необходимость использовать соединение после этого A объект будет уничтожен, то unique_ptr очевидно, не будет достаточно, и shared_ptr в порядке, здесь.

Есть несколько других возможностей для рассмотрения. Например, если экземпляр класса A динамически распределен и использует std::shared_ptr<A> для ссылки на него, в тех местах, где это необходимо; это доказывает, по контракту, что данный A остается в наличии, если требуется базовое SQL-соединение. В таких случаях unique_ptr не будет иметь большую часть добавленной стоимости. Тем не менее, имеет смысл воспользоваться этим подходом, если A реализует некоторые функциональные возможности с добавленной стоимостью поверх базового SQL-соединения.

+1

Кроме того, если объект класса 'A' ​​действительно принадлежит ресурсу, а указатель никогда не может быть нулевым, он должен возвращать ссылку вместо необработанного указателя. –

1

Если ваше приложение является multi_threaded, открытие нескольких экземпляров соединения с базой данных является предпочтительным и, следовательно, с использованием std :: unique_ptr в каждом экземпляре. Это позволит избежать узких мест при совместном использовании ресурсов базы данных.

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