正确初始化具有参数的类成员对象的方法

时间:2017-10-01 07:10:22

标签: c++ boost boost-asio

我有一个类'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

2 个答案:

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