Если вы хотите использовать защищенный член как общедоступный, вы должны предоставить собственный класс, который является дочерним по отношению к классу, защищенный метод которого вы собираетесь использовать. Нет ничего, что запрещало бы вам создать дочерний класс, наследующий 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 должны приниматься другими API Qt. Однако нет никакой гарантии, что он будет работать так, как вы ожидаете. Разработчики Qt хотели, чтобы этот метод был защищен по некоторым причинам. Так что используйте его с осторожностью.
person
Vaidotas Strazdas
schedule
30.07.2019