2017-10-01 7 views
1

私はboost.asio tcpソケットをクラスメンバーにしてすべてのクラス関数を取る必要がないようなクラス 'TcpCom'を持っています(私が作ろうとしている 'COM'基底クラスのジェネリックデザインを破って)パラメータとしてTCPソケットに入れます。しかし、クラスのメンバ初期化リストでソケットを適切に初期化する方法が混乱しています。パラメータを持つクラスメンバーオブジェクトを初期化する正しい方法

通常、それを使用して作成することになります。私は同様の問題に遭遇したとき

boost::asio::io_service io_service; 
boost::asio::ip::tcp::socket tcpSocket(io_service); 

は、以前私は、オブジェクトのクラスメンバー私はメンバー初期化リストでnewを使用して初期化されたオブジェクトのunique_ptrを作ったが、後それは悪い習慣でした。このデザインを動作させる良い方法があるのでしょうか、あるいはTcpComがTCPソケットをパラメータとして受け入れるべきでしょうか?

#ifndef TCPCOM_H 
#define TCPCOM_H 
#include "COM.h" 
#include <boost/asio.hpp> 

class TcpCom : public COM { 

public: 
    TcpCom() : remoteHost(""), remotePort(""), connectedToRemoteHost(false) 
    { } 
    void sendMessage(); 
    void connectToRemoteHost(std::string host, std::string port); 

private: 
    //Needs to be initialized 
    boost::asio::io_service io_srv; 
    //Needs to be initialized 
    boost::asio::ip::tcp::socket tcpSocket; 

    std::string remoteHost; 
    std::string remotePort; 
    bool connectedToRemoteHost; 
}; 

#endif 

-

#ifndef COM_H 
#define COM_H 
#include <string> 

class COM { 
    public: 
     COM(); 
     virtual void sendMessage() = 0; 
     virtual void connectToRemoteHost(std::string host, std::string port) = 0; 
     bool connectedToRemoteHost; 
     virtual ~COM(); 
    protected: 
    private: 
}; 

#endif // COM_H 

答えて

3

あなたは、彼らが自動変数である場合にそうであるようにあなたはそれがかなり多くを行うだろう。しかし、1つの警告が

TcpCom() : io_srv(), tcpSocket(io_srv), remoteHost(""), 
      remotePort(""), connectedToRemoteHost(false) 
{} 

があります。メンバの初期化順序は、クラス定義の順序であるの順序で決定され、メンバ初期化子リストに書き込まれた順序ではありません。それで、あなたが慎重でない場合は、未定義の振る舞いに陥るので、物事を動かすなら、それを覚えておいてください。このような場合には

1

、私はconsider NSMIでしょう:

#include <boost/asio.hpp> 

class TcpCom : public COM { 

    public: 
    void sendMessage(); 
    void connectToRemoteHost(std::string host, std::string port); 

    private: 
    boost::asio::io_service io_srv; 
    boost::asio::ip::tcp::socket tcpSocket {io_srv}; 

    std::string remoteHost; 
    std::string remotePort; 
    bool connectedToRemoteHost = false; 
}; 
関連する問題