2017-06-12 146 views
1

我有一个类,DBProc,这使得到PostgreSQL的连接,并允许用户提交查询/检索的结果。C++ pqxx的PostgreSQL离散连接类,确定范围类指针

功能上,一切正常。

的DBProc ::连接()函数用于连接类型的可选参数。 3个变体是:直接,懒惰,异步。

我有一个根据用户的选择实例正确的连接类代码。我预先初始化了3个unique_ptr <>,每个可能的连接类一个,然后使用switch语句选择所选的类类型。

这一切工作正常...但

我更倾向于将有一类变种保存到 参考连接类

(所有的类具有完全相同的功能) ,但我认为没有简单的方法来做到这一点。 'auto & 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'为['pqxx :: connection_base'(http://pqxx.org/devprojects /libpqxx/doc/4.0/html/Reference/a00023.html),它是所有连接类型的通用基类? –

+0

Thx!以为我曾尝试过,并认为它不会工作,因为pqxx :: connection_base是一个抽象类...但是,嘿,它的工作原理8-) – bigswifty

+0

@Some程序员哥们 – bigswifty

回答

1

由 '一些程序员花花公子' 在评论规定工作答案

为什么不能有一个std ::的unique_ptr到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; 
    }