C ++ pqxx postgresql классы дискретных соединений, указатель на область видимости

У меня есть класс 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
...
}

1

Решение

Рабочий ответ, предоставленный в комментарии «неким программистом, чувак»

Почему бы не использовать 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;
}
1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]