如何在现有构造函数中添加附加参数。 C++ ASIO

Posted

技术标签:

【中文标题】如何在现有构造函数中添加附加参数。 C++ ASIO【英文标题】:How to add additional parameter in existing constructor. C++ ASIO 【发布时间】:2021-12-15 17:33:13 【问题描述】:

我需要帮助来构建具有 3 个论点的端点。目前“IP 地址”和“端口”在构造函数中。但我需要包含一个整数参数来识别连接。理想情况如下所述。 asio::ip::tcp::endpoint endpoint(asio::ip::make_address("127.0.0.1", ec), 7497, clientId = 0);

您能否帮助我是否必须修改基类或者我可以继承基类并添加这个论点?如果继承容易,请指导我。


int main(int argc)

    int clientId = 0;
    asio::error_code ec;
    // Create a "context" - essentially the platform specific interface
    asio::io_context context;
    // Get th addres of somewhere w wish to connect to 
    asio::ip::tcp::endpoint endpoint(asio::ip::make_address("127.0.0.1", ec), 7497);
    // Create a socket, the context will deliver the implementation
    asio::ip::tcp::socket socket(context);
    // tell socket to try and connect
    socket.connect(endpoint, ec);
    if (!ec)
    
        std::cout << "Conected!" << std::endl;
    
    else
    
        std::cout << "Failed to connect to address:\n" << ec.message() << std::endl;
    
    if (socket.is_open())
    system("pause");
    return 0;

继承类:

#pragma once

#include <iostream>

#ifdef _WIN32
#define _WIN32_WINNT 0x0A00
#endif
#define ASIO_STANDALONE
#include <asio.hpp>
#include <asio/ts/buffer.hpp>
#include <asio/ts/internet.hpp>


// Get th addres of somewhere w wish to connect to 
class clien : public asio::ip::tcp::endpoint, asio::ip::address

public:
    typedef asio::ip::tcp::endpoint endpoint;
    char asio::ip::address;

    int clientId;

    //clien(int cid);

    clien(str ep, int p, int cid) : asio::ip::tcp::endpoint(ep), char asio::ip::address, int cid;
    
        clientId = cid;
    
;

【问题讨论】:

这门课是你做的吗?如果不是,那么继承是唯一(合理)的方式。 嗨,不,该类来自 ASIO 头文件。我正在尝试继承基类并派生一个子类。但我是 C++ 的新手并且正在苦苦挣扎。所以,到目前为止,我已经编写了这段代码 - 请在继承类部分中参考它。 【参考方案1】:

因为类重载方式看起来是最简单的:

class clien : public asio::ip::tcp::endpoint 
                                                 // inherit endpoint (because it the class you want to change)
    protected:
        
         int __cid; // the id
    public:
         int clientId() const  return __cid;   // getter
         void clientId(int cid)  __cid = cid;  // setter 

    clien(str ep, int p, int cid) :
        asio::ip::tcp::endpoint(ep, p),          // construct the actual endpoint
        __cid(cid)                             // set the cid
;

我不熟悉这个库,所以某些类型(对于构造函数)可能是错误的。

【讨论】:

【参考方案2】:

你可以使用端点和id创建一个新类型

struct MyEndpoint
  asio::ip::tcp::endpoint endpoint;
  int someId;  
   

创建端点

auto const someId = 42;
auto myEndpoint = MyEndpoint .endpoint =  boost::asio::ip::tcp::v4 (), 7497 , .someId = someId ;   

现在您可以获取 id 和端点

myEndpoint.someId;   // To get the id
myEndpoint.endpoint; // To get the endpoint  

另一种思路是做一对id和endpoint

auto const someId=42;
auto idAndEndpoint= std::make_pair(someId, asio::ip::tcp::endpoint(asio::ip::make_address("127.0.0.1", ec), 7497));

现在您可以获取 id 和端点

auto &[id, endpoint] = idAndEndpoint;

【讨论】:

以上是关于如何在现有构造函数中添加附加参数。 C++ ASIO的主要内容,如果未能解决你的问题,请参考以下文章

如何验证 C++ 构造函数中的输入参数?

是否可以附加到现有文件的第一行?

如何在 C++ 中调用基类的参数化构造函数?

C++:如何在结构中定义类实例。类具有参数化构造函数[重复]

C++ 如何实现这一参数构造函数?

在哪些情况下调用 C++ 复制构造函数?