【问题标题】:QT/C++ class declaration of private member not visible to constructor? [closed]QT/C++ 私有成员的类声明对构造函数不可见? [关闭]
【发布时间】:2013-09-28 22:17:19
【问题描述】:

我有一个名为serverserver.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 保密。但是,当我在类声明中将它们设为私有时,编译器抱怨我的构造函数初始化不允许更改这些私有成员。为什么?构造函数不是在同一个类中,所以应该可以改变私有变量?

【问题讨论】:

  • 这个问题似乎是题外话,因为它是关于一个简单的 C++ 错误。它不会帮助其他任何人。
  • @KubaOber 这并不一定会离题。
  • @SimonAndréForsberg:参见例如this meta question.

标签: c++ qt class private


【解决方案1】:

为什么?

因为在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 */)
{
   ...
}

Where to put default parameter value in C++?

【讨论】:

  • 所以一般我应该在类函数的头部定义中放一个默认定义(eg:=0),但在类函数的实现中不应该重复?
【解决方案2】:

也许你打算写:

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

【讨论】:

    【解决方案3】:

    你忘记了类标识符:

    Server::Server(...
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-10-14
      • 1970-01-01
      • 2016-02-21
      • 2011-02-24
      • 1970-01-01
      • 2010-10-25
      • 1970-01-01
      相关资源
      最近更新 更多