私は C++ 継承にかなり慣れていないので、ブースト ソケットを使用しています。同期ブースト ソケット用の Java の DataOutputStream に匹敵するものを作成したいと考えています。つまり、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);
コンパイラは私にエラーを与えます, error: 'boost::noncopyable_::noncopyable::noncopyable(const boost::noncopyable_::noncopyable&)' is private 私はクラスがブーストの一部ではないことに関係があると考えました図書館。
他のboost::asio::basic_stream_socketから継承してみましたが、それもエラーになりました。(非常に奇妙な 'Invalid use of "::" ' エラーでした) また、通常の 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]));
}
しかし、継承方法はより良い設計のようです。私が欠けているものはありますか、それともブーストライブラリは私が試みている方法で拡張するように設計されていませんか? ありがとう!