Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/160.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ QT/C++;私有成员的类声明对构造函数不可见?_C++_Qt_Class_Private - Fatal编程技术网

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

C++ QT/C++;私有成员的类声明对构造函数不可见?,c++,qt,class,private,C++,Qt,Class,Private,我有一个名为server和server.h的类,如下所示: class Server : public QTcpServer { Q_OBJECT public: Server(QHostAddress listenAddress, quint16 listenPort, QObject *parent = 0); QHostAddress hostAddress; quint16 hostPort; protected: void incomingC

我有一个名为
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
如下(部分):


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

也许您想写:

服务器::服务器(QHostAddress listenAddress,quint16 listenPort,QObject*parent=0) :主机地址(listenAddress)、主机端口(listenPort)、QTcpServer(父级) { }
也许你想写:

服务器::服务器(QHostAddress listenAddress,quint16 listenPort,QObject*parent=0) :主机地址(listenAddress)、主机端口(listenPort)、QTcpServer(父级) { }
您忘记了类标识符:

Server::Server(...

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

您忘记了类标识符:

Server::Server(...
然后,对于编译器,您不在成员函数中,您可以访问私有内存

为什么?

因为在
server.cpp
中,您也忘记了指定类名,您只指定了方法的名称,所以这是全局命名空间中名为
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 */)
{
   ...
}

为什么?

因为在
server.cpp
中,您也忘记了指定类名,您只指定了方法的名称,所以这是全局命名空间中名为
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 */)
{
   ...
}

因此,一般来说,我应该在类函数的头定义中放置一个默认定义(例如:=0),但不应该在类函数的实现中重复它?因此,一般来说,我应该在类函数的头定义中放置一个默认定义(例如:=0),但是在类函数的实现中不应该重复它吗?这个问题似乎是偏离主题的,因为它是关于一个简单的C++错误。它不会帮助任何其他人。“KubaOber,这不一定使它偏离主题。”西蒙德弗雷斯伯格:例如,这个问题似乎是偏离主题,因为它是一个简单的C++错误。这对其他任何人都没有帮助。@KubaOber,这不一定会使它偏离主题。@SimonAndréForsberg:参见示例。