我是C ++继承的新手,我正在使用boost套接字。我想创建一个类似于Java的DataOutputStream的同步boost套接字。也就是说,我想要SendInt,ReadLong等方法。 我尝试创建一个继承自套接字的类,但我一直在收到错误。现在,我有这样的事情:
DataSocketStream.h
#include "boost/asio.hpp"
#include <vector>
namespace Server {
using namespace std;
namespace as = boost::asio;
namespace ip = boost::asio::ip;
class DataSocketStream : public ip::tcp::socket{
public:
DataSocketStream(as::io_service);
virtual ~DataSocketStream();
void WriteInt(int);
void WriteLong(long);
int ReadInt(boost::system::error_code);
long ReadLong(boost::system::error_code);
void Flush (boost::system::error_code);
string ReadString(boost::system::error_code);
double ReadDouble(boost::system::error_code);
void WriteDouble(double);
private:
ip::tcp::socket* socketFormPtr
std::vector<char> Message;
};
DataSocketStream.cpp
#include "DataSocketStream.h"
namespace Server {
namespace as = boost::asio;
namespace ip = boost::asio::ip;
using namespace std;
DataSocketStream::DataSocketStream(as::io_service ios)
: ip::tcp::socket(ios)
{
socketFormPtr = this;
}
DataSocketStream::~DataSocketStream()
{
}
void DataSocketStream::WriteInt(int toWrite){
//Implementation that pushes the bytes onto the vector Message
}
void DataSocketStream::WriteLong(long toWrite){
//...
}
void DataSocketStream::Flush(boost::system::error_code e)
{
as::write(*socketFormPtr, as::buffer(Message), as::transfer_all(),e);
delete (&Message);
std::vector<char> Message;
}
int DataSocketStream::ReadInt(boost::system::error_code e)
{
char Af[4];
as::read(*socketFormPtr, as::buffer(Af), e);
return ((Af[0]<<24)| (Af[1]<<16) | (Af[2]<<8) | (Af[3]));
}
long DataSocketStream::ReadLong(boost::system::error_code e)
{
//...
}
string DataSocketStream::ReadString(boost::system::error_code e)
{
//...
}
double DataSocketStream::ReadDouble(boost::system::error_code e)
{
//...
}
void DataSocketStream::WriteDouble(double val)
{
//...
}
}
然而,当我尝试类似的东西时 as :: io_service io_service; DataSocketStream CLsocket(io_service);
编译器给我一个错误,错误:'boost :: noncopyable _ :: noncopyable :: noncopyable(const boost :: noncopyable _ :: noncopyable&amp;)'是私有的 我认为这与我的班级没有成为升级库的一部分有关。
我尝试从其他boost :: asio :: basic_stream_socket继承,但我也犯了错误。 (这是一个非常奇怪的'无效使用“::”'错误) 我还尝试创建一个普通的boost :: asio :: ip :: tcp :: socket,然后将指针转换为DataSocketStream的指针,但这也不起作用。
我知道我可以用辅助方法的形式完成所有这些,例如:
int ReadInt(boost::asio::ip::tcp::socket* S, boost::system::error_code e)
{
char Af[4];
as::read(*S, as::buffer(Af), e);
return ((Af[0]<<24)| (Af[1]<<16) | (Af[2]<<8) | (Af[3]));
}
但继承方式似乎是更好的设计。有什么我缺少的,或者升级库真的不是为了扩展我的尝试方式吗? 谢谢!
答案 0 :(得分:1)
DataSocketStream(as::io_service);
如错误所示,io_service是不可复制的,通过引用传递
DataSocketStream(as::io_service&);
^