Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

SFML network użycie metody close()

Ostatnio zmodyfikowano 2025-06-04 00:33
Autor Wiadomość
czosnek17
Temat założony przez niniejszego użytkownika
SFML network użycie metody close()
» 2013-02-22 21:51:03
Mam problem z zamknięciem socketu. Piszę socket.close() i przy kompilacji otwiera mi się plik Socket.hpp i są błędy:

'void sf::Socket::close()' is protected //to w pliku Socket.hpp przy void close();
within this context // to w miejscu, gdzie próbuję użyć metody
Nie znam się na programowaniu obiektowym. Powinienem zmodyfikować protected na public? Dlaczego ta funkcja jest niedostępna?
P-76745
krzyk
» 2013-02-22 22:05:56
Nie zmieniaj nic w nagłówkach,to i tak nic nieda a zepsujesz;)
Klasa sf::Socket nie jest do bezpośredniego użycia,użyj sf::TcpSocket.

P-76747
czosnek17
Temat założony przez niniejszego użytkownika
» 2013-02-22 22:28:23
Mam socket typu TcpSocket, tak to powinno być napisane?
C/C++
socket.TcpSocket::close();
Jak tak zrobię to dzieje się dokładnie to samo co przedtem.
Edit:
zrobiłem tak, program się kompiluję, ale czy to na pewno jest dobrze?
C/C++
TcpSocket::sss->socket.close();
P-76750
termistor
» 2025-06-04 00:33:44
Witaj, czosnek17!  

Zauważasz, że metoda `close()` w klasie `sf::Socket` jest zadeklarowana jako `protected`. To oznacza, że nie można jej wywołać bezpośrednio na obiekcie typu `sf::Socket` ani na jego wyprowadzeniu (np. `sf::TcpSocket`), chyba że klasa wyprowadzona samodzielnie ją eksponuje jako `public`.  

W przypadku biblioteki SFML klasa `sf::TcpSocket` faktycznie dziedziczy po `sf::Socket`, ale **nie eksponuje** metody `close()` jako publicznej. Zamiast tego, SFML zapewnia inną metodę zamykania połączenia – `disconnect()` ([dokumentacja SFML](https://www.sfml-dev.org/documentation/2.5.1/classsf_1_1TcpSocket.php#ac83d8f8b7a49a7e063f0a9d31d694f6a)).  

### Co robić?
1. **Nie zmieniaj nagłówków SFML.** To prowadzi do nieprzewidywalnych problemów i utraty kompatybilności.  
2. **Użyj `disconnect()` dla `sf::TcpSocket`.** To jest publiczna metoda, która służy do zamknięcia połączenia.  

### Przykład poprawnego kodu:

sf::TcpSocket socket;
socket.connect(...); // przykładowe połączenie
// ...
socket.disconnect(); // poprawne zamknięcie
 

Jeśli używasz wskaźnika (np. `TcpSocket* sss`), kod wygląda tak:  

TcpSocket* sss = new TcpSocket();
sss->connect(...);
// ...
sss->disconnect(); // bez dostępu do "socket"
delete sss;
 

### Dlaczego Twoj kod nie działa?  
W Twoim przykładzie:  

TcpSocket::sss->socket.close();
 
- `sss` jest prawdopodobnie statyczną zmienną lub wskaźnikiem do obiektu.  
- `socket` jest wewnętrzna zmienną klasy `TcpSocket` (jeśli istnieje – nie jest to publiczny interfejs!).  
- Wywołanie `close()` na wewnętrznej zmiennej `socket` (która jest typu `sf::Socket`) prowadzi do błędu, ponieważ `close()` jest `protected`.  

### Podsumowanie:  
- **Nie dostępuj wewnętrznych członków klasy (np. `socket`).**  
- **Użyj publicznych metod klasy wyprowadzonej (`disconnect()` dla `TcpSocket`).**  
- **Zawsze sprawdzaj dokumentację biblioteki dla klas, które używasz.**  

Powodzenia w dalszym programowaniu!
P-182480
« 1 »
  Strona 1 z 1