如何使用受保护的函数 setLocalPort?

Posted

技术标签:

【中文标题】如何使用受保护的函数 setLocalPort?【英文标题】:How to use protected function setLocalPort? 【发布时间】:2019-07-19 13:40:01 【问题描述】:

我应该使用 setlocalport 进行套接字连接,但该属性受到保护,并且我有一个编译错误。

这是在 qt 应用程序中。

m_pSocket = new QTcpSocket();

m_pSocket->setLocalPort(m_iLocalPort);

错误:'void QAbstractSocket::setLocalPort(quint16)' 受保护

【问题讨论】:

protected 意味着您必须找到其他方法来设置端口,或者您必须继承类并在继承的类中将 setLocalPort 声明为公共。并且不要忘记,在大多数情况下,保护方法是有充分理由的。 为什么要使用 setLocalPort()?如果你真的想设置本地端口,你应该使用bind。 setLocalPort() 实际上并不绑定到套接字的端口,并且仅在非常特殊的情况下有用。否则,按照 Marco 所说的去做,继承 QAbstractSocket。 【参考方案1】:

如果您想像使用公共成员一样使用受保护成员,那么您应该提供一个自定义类,该类是您打算使用其受保护方法的类的子类。没有什么可以禁止您创建继承QTcpSocket 的子类,然后使用您想要的受保护方法。此处描述的QTcpSocket 案例的示例如下。

// Let us define CustomTcpSocket, i.e. the class inheriting QTcpSocket
#pragma once
#include <QTcpSocket>


class CustomTcpSocket
    : public QTcpSocket

    Q_OBJECT
public:
    CustomTcpSocket(QObject* parent = nullptr);
    virtual ~CustomTcpSocket();

    // This method will be used to call QTcpSocket::setLocalPort which is protected.
    void SetLocalPort(quint16 port);
;

然后,我们提供实现本身。

#include "CustomTcpSocket.h"

CustomTcpSocket::CustomTcpSocket(QObject* parent)
    : QTcpSocket(parent)



CustomTcpSocket::~CustomTcpSocket()



void CustomTcpSocket::SetLocalPort(quint16 port)

    // Since method is protected, and scope is the child one, we can easily call this method here.
    QAbstractSocket::setLocalPort(port);

现在我们可以通过以下方式轻松使用这个新创建的类。

auto customTcpSocketInstance = new CustomTcpSocket();
customTcpSocketInstance->SetLocalPort(123456);

通过使用多态,CustomTcpSocket 的实例应该被其他 Qt 的 API 接受。但是,不能保证它会像您期望的那样工作。出于某些原因,Qt 开发人员希望保护此方法。所以,请谨慎使用。

【讨论】:

以上是关于如何使用受保护的函数 setLocalPort?的主要内容,如果未能解决你的问题,请参考以下文章

如何强制实现受保护的静态函数

我可以/如何...在 PHP 中的类之外调用受保护的函数

将 make_shared 与受保护的构造函数 + 抽象接口一起使用

c++,如何创建线程受限/受保护的变量和函数?

如何从 Derived 内部调用 Base 实例中的受保护成员函数?

如何验证 PDO 中的连接是不是受 SSL 保护?