#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(); }