2

接続を簡単に使用できるように、Boost ソケットを操作するクラスを作成しようとしています。
SocketClientのクラスには、boost::asio::ip::tcp::socketそのうちの1つであるいくつかのプロパティがあります。しかし、コンストラクターがないため、ユニット化されていないため、コンストラクターでC2512エラーが発生します。 ここで、クラスのコードを参照してください。boost::asio::ip::tcp::socket

class SocketClient {
private:
    int port;    //Port, currently unused
    boost::asio::io_service io_service;  
    boost::asio::ip::tcp::resolver::iterator endpoint_iterator;  
    boost::asio::ip::tcp::socket sock;  //This causes the error
    //It wants to be like this (impossible too):
  //boost::asio::ip::tcp::socket sock(io_service);
public:
    void init(const char*, const char* );
    SocketClient();  //Default constructor
    bool connect();
    bool read(int bytes, char *text);
    bool send(int length, char *text);
    bool send(std::string text);
    unsigned int timeout;
};

そして、ここにコンストラクタがあります:

SocketClient::SocketClient() {  //ERROR: (23): error C2512: 'boost::asio::basic_stream_socket<Protocol>' : no appropriate default constructor available
    sock=boost::asio::ip::tcp::socket(io_service);  //Adding this didn't help
}

じゃあ何をすればいいの?そのままにしておく必要sockがありvoid*ますか?

4

4 に答える 4

4

初期化リストを使用します:

SocketClient::SocketClient() 
    :
    sock(io_service)
{
    // Other initialization code here...
}

ただし注意してください: これは明確に定義されています。これは、メンバ変数がクラス定義に出現する順序で構築され、 の前にio_service出現するためです。そうでない場合は、初期化されていないオブジェクトを のコンストラクターに渡し、未定義の動作が発生する可能性が高くなります。 socksocket

于 2013-03-14T21:35:10.627 に答える
0

一般に、すでに述べたように、可能な限り初期化リストを使用してください。また、メンバーを識別する命名スキームを使用します。

すでに述べた - 初期化はメンバーの順序に依存します。メンバー間に依存関係がある場合、これはほとんどの場合、設計エラーの兆候です。臭い。少なくとも、これをコードで十分に文書化してください。常に次のメンテナーがいます。もちろん、型付き (スマート) ポインターを介して常に要素を保持できます。

具体的な問題については、参照を介して io_service を渡すことをお勧めします。これにより、io_service をより詳細に制御できます (たとえば、非同期モードを使用し、1 つの io_service 内で複数のソケットを実行します)。

#include <boost/asio.hpp>

class SocketClient {
private:
    boost::asio::io_service& m_io_service;
    boost::asio::ip::tcp::socket m_socket;

[...]

public:
    SocketClient(boost::asio::io_service& io_service);

[...]

};


SocketClient::SocketClient(boost::asio::io_service& io_service)
    : m_io_service(io_service)
    , m_socket(io_service)
    [...]
{
}
于 2014-10-13T15:40:04.560 に答える
0

ヘッダー.h

boost::asio::ip::tcp::socket *sock;

本体.cpp

sock = new boost::asio::ip::tcp::socket(service);
于 2015-03-20T08:35:52.343 に答える