我有一个类'TcpCom',其中我想将boost.asio tcp套接字作为类成员,以便所有类函数不必将TCP套接字作为参数(打破通用)我试图制作的'COM'基类的设计)。但是,我对如何在类的成员初始化列表中正确初始化套接字感到困惑。
通常使用以下方法创建:
boost::asio::io_service io_service;
boost::asio::ip::tcp::socket tcpSocket(io_service);
之前当我遇到类似的问题时,我使对象类成员成为我在成员初始化列表中使用unique_ptr
初始化的对象的new
,但后来读到这是不好的做法。是否有一种很好的方法可以使这个设计工作,或者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
答案 0 :(得分:3)
你做的几乎就像你做自动变量一样:
TcpCom() : io_srv(), tcpSocket(io_srv), remoteHost(""),
remotePort(""), connectedToRemoteHost(false)
{}
但有一点需要注意。成员的初始化顺序由它们在类定义中的顺序确定,而不是在成员初始化程序列表中写入的顺序。因此,如果你移动东西,请记住这一点,因为如果你不小心,你会遇到未定义的行为。
答案 1 :(得分: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;
};