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

标签 c++ boost boost-asio

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

最佳答案

你会像当它们是自动变量时那样做:

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

但是有一个警告。成员的初始化顺序由它们在类定义中的顺序决定,而不是由成员初始值设定项列表中写入的顺序决定。因此,如果您移动东西,请记住这一点,因为如果您不小心,就会遇到未定义的行为。

关于c++ - 初始化具有参数的类成员对象的正确方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46510055/

相关文章:

c# - C# 程序如何使用任何版本的 C++ dll?

c++ - 有没有一种优雅的方式来桥接 Asio 中的两个设备/流?

android - 将 (Boost) Asio 与 Android NDK 结合使用的限制

c++ - 如何在 Linux 中正确链接 boost 库

c++ - 如何在 boost::multiprecision::mpfr 中使用复数?

将 asio 套接字多播 boost 到特定的以太网接口(interface)

c++ - Boost Asio HTTPS 请求给出 'certificate verify failed' 错误

c++ - 了解 shared_ptr::void reset (U* p) 的异常安全;

CLR dll 需要 C++ .lib 文件,但非 CLR 不需要

c++ - 即使在混合后也想要透明图像