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