我有一个名为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)
{
}
问题在于我希望将hostAddress
和hostPort
设为私有。但是,当我在类声明中将它们设为私有时,编译器抱怨我的构造函数初始化不允许更改这些私有成员。为什么?不是同一个类中的构造函数,所以它应该能够更改私有变量吗?
答案 0 :(得分:2)
为什么?
因为在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 */)
{
...
}
答案 1 :(得分:1)
也许你打算写:
Server::Server(QHostAddress listenAddress, quint16 listenPort, QObject *parent = 0)
: hostAddress(listenAddress), hostPort(listenPort), QTcpServer(parent)
{
}
答案 2 :(得分:1)
您忘记了班级标识符:
Server::Server(...
然后,对于编译器,您不在成员函数中,并且可以访问私有元素。