2017-06-12 70 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; 
    }