2013-09-28 2 views
1

У меня есть класс с именем server с server.h следующим образом:Объявление класса QT/C++ частного члена, не видимого конструктору?

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

Этот вопрос, как представляется, не по теме, поскольку речь идет о ошибке простой C++ , Это никому не поможет. –

+0

@KubaOber Это не обязательно делает это вне темы. –

+0

@ SimonAndréForsberg: см., Например, [этот мета-вопрос] (http://meta.stackexchange.com/questions/167342/close-all-the-typo-questions). –

ответ

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

Where to put default parameter value in C++?

+0

Итак, в общем случае я должен поместить определение по умолчанию (например: = 0) в определение заголовка функции класса, но не следует повторять его при реализации функции класса? – TSG

1

Возможно, вы имели в виду, чтобы написать:

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

Вы забыли идентификатор класса:

Server::Server(... 

Тогда для компилятора, вы не в функции члена, и вы можете получить доступ к частному membres.

Смежные вопросы