QT/C++ 私有成员的类声明,对构造函数不可见

QT/C++ class declaration of private member not visible to constructor?

本文关键字:构造函数 声明 C++ 成员 QT      更新时间:2023-10-16

我有一个名为 server 的类,其server.h如下所示:

class Server : public QTcpServer
{
    Q_OBJECT
public:
    Server(QHostAddress listenAddress, quint16 listenPort, QObject *parent = 0);
    QHostAddress hostAddress;
    quint16 hostPort;
protected:
    void incomingConnection(qintptr socketDescriptor);
private:
};

server.cpp如下(部分(:

Server(QHostAddress listenAddress, quint16 listenPort, QObject *parent = 0)
    : hostAddress(listenAddress), hostPort(listenPort), QTcpServer(parent)
{
}

问题是我想保持hostAddresshostPort的私密性。但是,当我在类声明中将它们设为私有时,编译器抱怨不允许我的构造函数初始化更改这些私有成员。为什么?构造函数不是在同一个类中,所以它应该能够更改私有变量吗?

为什么?

因为在server.cpp中您也忘记指定类名,所以您只指定了方法的名称,因此这是全局命名空间中称为Server的方法。因此,Server的私人成员无法从中访问。将其定义为

Server::Server(QHostAddress listenAddress, quint16 listenPort, QObject *parent)
    : hostAddress(listenAddress), hostPort(listenPort), QTcpServer(parent)
{
}

另请注意,在定义中,您应该省略=0以使其仅QObject *parent。可以在声明或定义中指定默认参数值,但不能同时指定两者。通常,您在函数声明中执行此操作,然后所有调用方都可以使用该默认值。请注意:

如果您希望函数的调用方能够看到默认值,则必须在定义中指定此值,如果您改用第二个版本,则只有看到该定义的用户才能使用默认值。如果函数在类中是私有的,则可能需要这样做。

如果您必须要在函数定义中重复默认参数值,可以在注释中执行此操作:

void foo(int x = 42,
         int y = 21);
void foo(int x /* = 42 */,
         int y /* = 21 */)
{
   ...
}

将默认参数值放在C++中的什么位置?

也许你的意思是写:

Server::Server(QHostAddress listenAddress, quint16 listenPort, QObject *parent = 0)
    : hostAddress(listenAddress), hostPort(listenPort), QTcpServer(parent)
{
}

您忘记了类标识符:

Server::Server(...

然后,对于编译器,您不在成员函数中,您可以访问私有 membres。