如何使用保护函数setLocalPort?

How to use protected function setLocalPort?

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

这是在qt应用程序中。

m_pSocket = new QTcpSocket();

m_pSocket->setLocalPort(m_iLocalPort);

错误:‘void QAbstractSocket::setLocalPort(quint16)’受到保护

如果您想像 public 一样使用受保护成员,那么您应该提供一个自定义 class,它是您打算使用其受保护方法的 class 的子项.没有什么可以禁止您创建子 class 继承 QTcpSocket, and then using the protected method you want. Example for the 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);
}

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

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

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