Использование переменной-члена для установки адреса.sin_port

#c

Вопрос:

В настоящее время я сижу над небольшим проектом на C , где пытаюсь написать класс, реализующий сокеты tcp, когда я наткнулся на следующее:

 ServerSocket::ServerSocket(uint16_t port_) {  struct sockaddr_in _address;  uint16_t _port = port_;  this-gt;bindSocket(); }  int ServerSocket::bindSocket() {  _address.sin_port = htons(_port);  std::cout lt;lt; _address.sin_port lt;lt; std::endl; }  

Который печатает «0» и работает не так, как ожидалось, в то время как следующее работает так, как ожидалось:

 ServerSocket::ServerSocket(uint16_t port_) {  struct sockaddr_in _address;  this-gt;bindSocket(port_); }  int ServerSocket::bindSocket(uint16_t port_) {  _address.sin_port = htons(port_);  std::cout lt;lt; _address.sin_port lt;lt; std::endl; }  

Я не понимаю, как первый фрагмент кода не работает, и я действительно надеюсь, что кто-нибудь сможет помочь мне понять.

Комментарии:

1. uint16_t _port = port_; объявляет локальную переменную. Если _port это член класса, то вам нужно было сделать _port = port_;

2. Я понимаю, и мне немного стыдно. Большое вам спасибо за вашу помощь, добрый сэр! Сейчас он работает так, как и ожидалось.

Ответ №1:

Вы случайно объявили переменную вместо инициализации члена:

 ServerSocket::ServerSocket(uint16_t port_) {  struct sockaddr_in _address; // This is redundant  uint16_t _port = port_; // lt;-- oopsie  this-gt;bindSocket(); // redundant this }  

Это должно быть:

 ServerSocket::ServerSocket(uint16_t port_) {  _port = port_;  this-gt;bindSocket(); }  

Вы можете попытаться избежать подобных ситуаций в будущем, если будете использовать инициализатор списка

 ServerSocket::ServerSocket(uint16_t port_) : _port(port_) {  bindSocket(); }