2013-12-08 82 views
-3

這是我的情況:C++使用輸入參數作爲輸出

void Database::execute(string query, Table *outTable) { 

     //some code 

     if (isSelect) { 
      outTable = new Table(rowCount, columnCount); 
     } 

     // some code 

    } 

我的想法是,該函數執行執行對數據庫的查詢。如果查詢產生一個表(例如select),我分配outTable。 無論如何,在執行此函數後,當我嘗試在調用函數中使用outTable執行某些操作時,會出現段錯誤。我已經檢查過該函數用new命令執行該行。 這裏有什麼問題?

以下是我在調用函數做:

Database d = new Database("mydb");  
Table *t; 
d.execute("SELECT * FROM TABLE1", t); 
int n = t->rowCount(); //here I get the segfault 
+1

通過參考?或'* outTable =表(...);'? – 2013-12-08 19:39:36

+0

@ H2CO3我在關於函數調用的問題中添加了一些內容。請檢查一下。 –

+0

@the_cadyman然後第二個版本不適用,並且您需要通過引用傳遞。哦,不要等,首先你應該閱讀一個初學C++教程。 – 2013-12-08 19:42:46

回答

1

參數是函數的局部變量。所以在你的情況下,指向Table的原始指針不會被改變。只有該函數的局部變量會被改變。可以通過引用傳遞此參數,也可以使用指針應用更多的間接引用。例如

void Database::execute(string query, Table * &outTable); 
d.execute("SELECT * FROM TABLE1", t); 

void Database::execute(string query, Table * *outTable); 
d.execute("SELECT * FROM TABLE1", &t); 
+0

謝謝,你已經非常清楚了! –

1

Table *outTable是本地執行功能,它是通過在變量的副本,所以在調用函數表指針沒有得到分配的任何內部執行。

如果您只是在調用函數中打印表指針的地址,然後在執行本身內部打印outTable的地址(通過不取消引用指針),則可以驗證此操作。

+0

也謝謝你,spirs! :D –

1

問題是你正在傳遞一個指針 - 輸入變量是本地的函數。所以你需要獲取meta並傳遞你想要存儲out值的指針的地址,或者使用一個引用(它可以被實現爲指向一個契約的指針,語言會試圖確保具體的值被傳遞) 。

,去年值得注意的是:

bool Database::execute(const std::string& query, Table& into) 

這將避免複製查詢到一個臨時字符串本地執行,並允許呼叫者爲您提供一個表來通過你的函數來填充。

寫好一個公平的幾個,你可能要考慮使用布爾表示查詢是否成功與否,太:)

Table myTable; 
bool success = d.execute("SELECT 'fail' FROM DUEL", myTable); 
if (!success) 
    herp(); 

爲了更深入地瞭解指針看我以前的答案一個非常類似的問題:Pointer errors in the method of transmission(c++)

+0

謝謝kfsone,也感謝第一個參數的提示:D –