rui*_*eco 1 c++ operator-overloading c++11
我有一个类vector<unsigned char>
使用Asio的异步方法加载.然后我重载<<运算符以返回该数据.
问题是即使缓冲区已满且有效,操作员也不会返回任何数据.
我的缓冲区: vector<unsigned char>read_buffer;
操作员声明:
friend std::vector<unsigned char> operator<<(const vector<unsigned char>output, const shared_ptr<Socket>socket) noexcept;
Run Code Online (Sandbox Code Playgroud)
实施:
std::vector<unsigned char> operator<<(const vector<unsigned char>output,
const shared_ptr<Socket>socket) noexcept {
std::cerr << output.size() << std::endl;
std::cerr << socket->read_buffer.size() << std::endl;
return socket->read_buffer;
}
Run Code Online (Sandbox Code Playgroud)
哪里std::cerr << socket->read_buffer.size() << std::endl;
有正确的大小和一步一步的调试显示其内容也是有效的.
但是当我得到数据时:
vector<unsigned char> response;
response << socket;
Run Code Online (Sandbox Code Playgroud)
response
是空的.我已经尝试将其初始化为预期响应的长度,但我最终得到了一个带有X空字符的缓冲区.
被这困扰了.不应该将return语句复制或移出值吗?
你对发生的事情有一个错误的假设
response << socket;
Run Code Online (Sandbox Code Playgroud)
当您执行上述操作时,operator <<
未分配的返回值response
.相反,响应是运算符的左侧,而套接字是右侧,因为它是二元运算符.返回值本身将被捕获做类似的事情
auto foo = response << socket;
Run Code Online (Sandbox Code Playgroud)
但这不是你想要做的.您想要做的就是像对待流对象一样处理左侧cout
,并直接操作它.我们这样做的方式是改变签名和一点点的身体operator <<
.首先,我们需要通过引用传递向量,因为您要修改它,所以我们有
std::vector<unsigned char>& operator<<(const vector<unsigned char>& output,
const shared_ptr<Socket>socket) noexcept
^ lvalue references here ^
Run Code Online (Sandbox Code Playgroud)
然后我们改变身体从分配矢量socket
到output
,然后我们回到输出像
{
std::cerr << output.size() << std::endl;
std::cerr << socket->read_buffer.size() << std::endl;
output = socket->read_buffer;
return output;
}
Run Code Online (Sandbox Code Playgroud)
真的,虽然我认为只做建筑或分配而不是重载运营商会更好.你可以拥有
vector<unsigned char> response(socket->read_buffer);
// or
vector<unsigned char> response;
// stuff
response = socket->read_buffer;
Run Code Online (Sandbox Code Playgroud)
在您的主要代码中.
归档时间: |
|
查看次数: |
69 次 |
最近记录: |