Funkcja extern - przenoszenie zmiennej sfml 2.0

0

Witam mam taki problem, że mam serwer rozbity na 3 kody(2cpp i 1header).

Chciałbym to sf::TcpSocket* client = new sf::TcpSocket; przenieść jakoś przez extern by było można korzystać z client w innym pliku źródłowym... przy komendzie client -> send(packet); wywala mi błąd, że wymagany jest pointer;

0

Jaki pointer co za pointer?
Najpierw powiedz co gdzie się znajduje, i co do czego dołączasz, potem możemy kombinować :D
// edit
a najlepiej to po prostu pokaż kod.

0

W options.cpp mam deklaracje nowo dołączanych klientów sf::TcpSocket* client = new sf::TcpSocket;
W pliku header.h nie wiedziałem jak go przenieść, więc użyłem standardowo extern sf::TcpSocket client;
W pliku serwer.cpp użycie komendy client->send(package); skutkuje wyrzuceniem błędu:
//
1>serwer.cpp(44): error C2819: type 'sf::TcpSocket' does not have an overloaded member 'operator ->'
1> C:\Bibloteki\SFML-2.0\include\SFML/Network/TcpSocket.hpp(46) : see declaration of 'sf::TcpSocket'
1> did you intend to use '.' instead?
1>serwer.cpp(44): error C2232: '->sf::send' : left operand has 'class' type, use '.'
//
A w komendzie z serwer.cpp podświetla się client na czerwono pokazując komunikat - expression must have pointer type

Jeżeli zmienię w headerze na extern sf::TcpSocket *client; to otrzymuję inny błąd:
1>serwer.obj : error LNK2001: unresolved external symbol "class sf::TcpSocket * client" (?client@@3PAVTcpSocket@sf@@A)

Jak mam go w takim razie przenosić?

sf::TcpSocket *client2;
client2 = &client; też nie działa bo piszę, że takiej operacji nie da się wykonać...

0

wklej kod, bo ze szczątkowych błedów niewiele pożytku.

0

Trochę szkoda mi wrzucać ten kod, ale tym razem zrobię wyjątek...

Serwer - http://codepad.org/iNPGeAF2

Odcinek z options.cpp - http://codepad.org/mbwOUXtc

header - http://codepad.org/zHPQbnal

2

Unikaj zmiennych globalnych, bo to się zemści prędzej czy później. Od tego, żeby dostać się do odpowiednich zmiennych są funkcje i metody i tego się trzymaj!

0

Mógłbyś mi wytłumaczyć bardziej co masz na myśli?
Bo nie za bardzo rozumiem + czy to rozwiąże ten problem?

0

NIe znam całego Twojego projektu, ale jak masz np w jednym pliku jakąś zmienną, którą chcesz udostępnić w innym miejscu (jeśli musisz już coś takiego robic, bo dobrze przemyslane api w wyjatkowych wypadkach będzie zmuszało do takiego postepowania) to zrób
typ *MojaSuperZmienna();

i zwracaj tą zmienną, w innych plikach, chcąc tą zmienną wywołasz sobie tą funkcję.

0

Czyli w ten sposób mogę przenieść zmienną typu Non-Copyable?

Ogólnie problem jest taki:

W jednym pliku cpp mam zdeklarowane dodawanie klientów w pętli while w wątku. Jest to zmienna sf::TcpSocket której nie da się kopiować. Przy kilku użytkownikach ta zmienna wymaga tak jakby innego użycia wysyłania socketów - przy jednym socket.send(packet);
przy kilku użytkownikach jeżeli zmienna nazwana "client" - client->send(packet);

Problem polega na tym, że przy jednym kliencie da się bez problemu przenieść dane klienta, ale tej drugiej opcji z kilkoma zaczynają się pojawiać kompilakcje. Użycie client->send(packet); w innym pliku cpp skutkuje błędem informującym, że client powinien być wskaźnikiem.
Natomiast socket.send(packet); wywala błąd, że client został inaczej zdeklarowany...

Z racji tego iż tcpsocket jest nie kopiowalny nie mogę go podpiąć pod wskaźnik ani nic takiego.

0

Doszedłem do wniosku, że masz racje.

Funkcja z pętlą która dodaje nowych użytkowników nie zwraca wartości client do reszty kodu przez co reszta programu nie rozumie wywoływania client->send(packet);

Muszę tylko teraz jakoś zwrócić klasę w funkcji.

0

z tego co napisałeś to w extern masz zwyczajny obiekt a gdzie indziej tworzysz wskaźnik o tej samej nazwie... stąd zapewne błąd

0

Całkiem prawdopodobne tylko jak to inaczej rozwiązać?

0

Problem rozwiązany i dziękuje bardzo za pomoc gdyż pomogliście mi bardzo.

Problem leżał po stronie extern'u... wystarczyło uwzględnić extern class sf::TcpSocket* client; i już wszystko śmiga :D

1 użytkowników online, w tym zalogowanych: 0, gości: 1