У меня есть класс DBProc, который устанавливает соединение с PostgreSQL и позволяет пользователю отправлять запросы / получать результаты.
Функционально все работает.
Функция DBProc :: connect () принимает необязательный аргумент для типа соединения. 3 варианта: прямой, ленивый, асинхронный.
У меня есть код, который создает правильный класс соединения в соответствии с выбором пользователя. Я инициализирую 3 unique_ptr<> заранее, по одному для каждого возможного класса соединения, затем используйте инструкцию switch для выбора выбранного типа класса.
Это все работает нормально … но
Я предпочел бы иметь ОДИН класс var, который содержит ссылку на
класс соединения
(все классы имеют одинаковую функциональность), но я не вижу простого способа сделать это.
‘авто& currentConnection = lazyConnection ‘отлично работает в операторе switch, но, конечно, выходит за рамки после блока кода.
Если бы был способ создать переменную внутри блока и позволить ее увидеть за пределами блока, без предварительного объявления этого, это бы сработало, но я не верю, что это возможно в c ++.
Я не могу объявить это сначала, потому что все эти классы требуют инициализации после объявления.
Итак … c ++ atch 22 😉
Поэтому каждый раз, когда мне нужно использовать соединение, мне нужен оператор switch для выбора правильного указателя.
Я посмотрел на шаблоны, союзы, extern и не вижу способа сделать это ни с одним из них.
Если кто-нибудь знает, есть ли способ сделать это, пожалуйста, опишите.
Вот фрагмент кода класса func:
bool DBProc::connect(ConnectionType type) {
...
unique_ptr<pqxx::connection> connect;
unique_ptr<pqxx::lazyconnection> lzy_connect;
unique_ptr<pqxx::asyncconnection> async_connect;
try
{
switch (type) {
case ConnectionType::direct : {
connect = make_unique<pqxx::connection>(connOpts);
break;
}
case ConnectionType::lazy : {
lzy_connect = make_unique<pqxx::lazyconnection>(connOpts);
break;
}
case ConnectionType::async : {
async_connect = make_unique<pqxx::asyncconnection>(connOpts);
break;
}
} catch
...
}
Рабочий ответ, предоставленный в комментарии «неким программистом, чувак»
Почему бы не использовать std :: unique_ptr to pqxx :: connection_base, который является общим базовым классом для всех типов соединений? — Какой-то программист чувак
Упрощенный код:
unique_ptr<pqxx::connection_base> base_connect;
try
{
switch (type) {
case ConnectionType::direct : {
base_connect = make_unique<pqxx::connection>(connOpts);
break;
}
case ConnectionType::lazy : {
base_connect = make_unique<pqxx::lazyconnection>(connOpts);
break;
}
case ConnectionType::async : {
base_connect = make_unique<pqxx::asyncconnection>(connOpts);
break;
}
default:
error += "No valid connection type supplied (direct | lazy | async)";
return false;
break;
}
Других решений пока нет …