Как использовать защищенную функцию setLocalPort?

Я должен использовать setlocalport для подключения к сокету, но свойство защищено, и у меня возникает ошибка компиляции.

Это в приложении qt.

m_pSocket = new QTcpSocket();

m_pSocket->setLocalPort(m_iLocalPort);

ошибка: ‘void QAbstractSocket::setLocalPort(quint16)’ защищен


person smiss    schedule 19.07.2019    source источник
comment
защищенный означает, что вам нужно найти какой-то другой способ установить порт или вам нужно наследовать класс, а в унаследованном классе вы объявляете setLocalPort как общедоступный. И не забывайте, что в большинстве случаев есть веская причина, по которой метод защищен.   -  person Marco    schedule 19.07.2019
comment
Почему вы хотите использовать setLocalPort()? Если вы действительно хотите установить локальный порт, вам следует использовать привязку. setLocalPort() на самом деле не привязывается к порту к сокету и полезен только в очень специфических обстоятельствах. В противном случае сделайте то, что говорит Марко, и создайте подкласс QAbstractSocket.   -  person Rolf Winter    schedule 20.07.2019


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

person Vaidotas Strazdas    schedule 30.07.2019