2012-11-24 32 views
1

我有一個函數返回,我想檢索功能的字符串,並返回一個錯誤代碼:從參數和範圍

int Connection::RecvMsg(std::string* buffer) 
{ 
    buffer = &RecvBuffer.front(); 
    RecvBuffer.pop(); 
    return error_state; 
} 

我想從RecvBuffer彈出一個字符串,我想傳遞字符串tbrough參數。

我意識到緩衝區會在彈出後無效。是唯一的方法來聲明該函數內的靜態字符串?我應該採取更好的方式嗎?

+0

你可以標準::在RecvBuffer.front()的內容移動到由緩衝區指向的字符串,然後彈出沒有任何顧慮。 –

回答

3

我想你可能需要更多的東西是這樣的:

*buffer = RecvBuffer.front(); 

這將指定字符串任何buffer點。

+0

啊,ops!不知何故,我忘記了解除引用和複製。謝謝! – user1760520

0

在C++中傳播錯誤的推薦方法是使用異常機制。

如果您由於某種原因不想使用異常,則可以使用引用將信息傳回給調用者。

int Connection::RecvMsg(std::string &buffer) 
{ 
    buffer = RecvBuffer.front(); 
    RecvBuffer.pop(); 
    return error_state; 
} 

當然,你也可以使用指針,但在這種情況下,最好確保調用者不傳遞nullptr。所以你需要寫這樣的東西

int Connection::RecvMsg(std::string *buffer) 
{ 
    error_state = false; 

    if(buffer != nullptr) 
    { 
     *buffer = RecvBuffer.front(); 
     RecvBuffer.pop(); 
     error_state = true; 
    } 

    return error_state; 
} 
+0

啊,是的。最初我通過參考傳遞,並有第一個例子。但是,這不是指定一個地址嗎? - 編輯 - 行動,我只記得參考規則的變量。是的,這是一個副本。 – user1760520

0

outparameters不是模型幾個參數的唯一(和IMO不是最好的)選擇。相反,我會建議在pair返回這兩個值:

#include <utility> 
#include <string> 

std::pair<std::string,int> Connection::RecvMsg() { 
    if (recvBuffer.empty()) { 
    return std::make_pair<std::string,int>(std::string(),error_code); 
    } 
    std::string const front = recvBuffer.front(); 
    recvBuffer.pop(); 
    return std::make_pair<std::string,int>(front,no_error); 
}