У меня есть функция, где я хотел бы получить строку из функции и вернуть код ошибки:
int Connection::RecvMsg(std::string* buffer)
{
buffer = &RecvBuffer.front();
RecvBuffer.pop();
return error_state;
}
Я хочу вытолкнуть строку из RecvBuffer
и я хотел бы передать строку через параметр.
Я понял, что буфер будет недействительным после pop. Является ли единственный способ объявить статическую строку внутри этой функции? Есть ли лучшие способы, которыми я должен идти об этом?
Я думаю, что вы могли бы хотеть что-то вроде этого
*buffer = RecvBuffer.front();
Это назначит строку любому buffer
указывает на.
Рекомендуемый способ распространения ошибок в 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;
}
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);
}