1

次のように呼び出されるクラスがあり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です。ただし、クラス宣言でそれらをプライベートにすると、コンパイラーは、コンストラクターの初期化でこれらのプライベート メンバーを変更することは許可されていないと不平を言いました。なんで?コンストラクターは同じクラス内ではないので、プライベート変数を変更できるはずですか?

4

3 に答える 3

2

なんで?

server.cppクラス名も指定するのを忘れたため、メソッドの名前のみを指定したため、これはServerグローバル名前空間で呼び出されるメソッドです。したがって、のプライベート メンバーにServerはアクセスできません。次のように定義します

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

=0定義では、それをちょうどにするために省略する必要があることにも注意してくださいQObject *parent。宣言または定義のいずれかでデフォルトのパラメーター値を指定できますが、両方を指定することはできません。通常、関数宣言でこれを行うと、すべての呼び出し元がそのデフォルト値を使用できます。ご注意ください:

関数の呼び出し元がデフォルト値を参照できるようにする場合は、定義でこれを指定する必要があります。代わりに 2 番目のバージョンを使用すると、定義を参照した人だけがデフォルト値を使用できます。これは、関数がクラス内でプライベートである場合に望ましい場合があります。

関数定義でデフォルトのパラメーター値を必ず繰り返したい場合は、コメントで行うことができます。

void foo(int x = 42,
         int y = 21);

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

C++でデフォルトのパラメータ値をどこに置くのですか?

于 2013-09-28T22:27:20.017 に答える
1

おそらく、あなたは次のように書くつもりでした:

Server::Server(QHostAddress listenAddress, quint16 listenPort, QObject *parent = 0)
    : hostAddress(listenAddress), hostPort(listenPort), QTcpServer(parent)
{
}
于 2013-09-28T22:23:46.530 に答える
1

クラス識別子を忘れました:

Server::Server(...

次に、コンパイラの場合、メンバー関数ではなく、プライベート メンバーにアクセスできます。

于 2013-09-28T22:24:00.910 に答える