2017-10-01 67 views
1

我有一個類'TcpCom',其中我想將boost.asio tcp套接字作爲類成員,以便所有類函數不必採取在一個TCP套接字中作爲一個參數(打破了'COM'基類的通用設計,我試圖做)。然而,我對如何在類的成員初始化列表中正確初始化套接字感到困惑。正確初始化具有參數的類成員對象的方法

,通常要使用創建:

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

你會做它幾乎爲你當他們是自動變量做:

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; 
};