如何使用受保护的函数 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?的主要内容,如果未能解决你的问题,请参考以下文章
将 make_shared 与受保护的构造函数 + 抽象接口一起使用