2017-10-01 9 views
1

J'ai une classe 'TcpCom' dans laquelle je voudrais qu'un socket boost.asio tcp soit un membre de classe pour que toutes les fonctions de classe n'aient pas à prendre dans un socket TCP en tant que paramètre (briser le design générique de la classe de base 'COM' j'essaye de faire). Cependant, je suis confus sur la façon d'initialiser correctement le socket dans la liste d'initialisation de membre de la classe.Méthode correcte pour initialiser les objets membres de classe qui ont des paramètres

Normalement, il serait créé à l'aide:

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

Auparavant, lorsque je suis tombé sur un problème similaire, je fait le membre de la classe d'objet un unique_ptr de l'objet que j'initialisés avec new dans la liste d'initialisation de membre, mais plus tard J'ai lu que c'était une mauvaise pratique. Existe-t-il un bon moyen de faire fonctionner ce design, ou est-ce que TcpCom devrait simplement prendre en charge un socket TCP en tant que paramètre?

#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 

Répondre

3

tu le ferais à peu près comme vous le faites quand ils sont variables automatiques:

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

Il y a une mise en garde cependant. L'ordre d'initialisation des membres est déterminé par leur ordre dans la définition de classe, et non l'ordre écrit dans la liste des initialiseurs de membres. Alors gardez cela à l'esprit si vous déplacez des choses, parce que vous auriez un comportement non défini si vous ne faites pas attention.

1

Dans des cas comme cela, je 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; 
};