Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

Flutschi

Treue Seele

  • »Flutschi« ist der Autor dieses Themas

Beiträge: 90

Wohnort: Schweiz

  • Private Nachricht senden

1

26.10.2012, 04:02

SFML 2.0 & Network: NonCopyable umgehen mit Referenz, nur wie?

Hiho,


Ich würd gern diesen Code zum laufen bringen:

C-/C++-Quelltext

1
adresses.push_back(socket);


aber leider ist es NonCopyable, also habe ich hier die "Lösung" gefunden nur weis ich überhaupt nicht wie ich jetzt eine Referenz an List weitergebe.. Ich bin leider noch überhaupt nicht geübt in Referenzen, und jetzt dieses Thema durchzuschaun überfordert mich grad...

Ich dachte eigentlich das ich einfach eine Liste mache, und dann eine Referenz zu der Liste, und diese Referenz dann weitergebe, aber das klappt leider nicht und mehr weis ich auch nicht leider über Referenzen :/

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
//Mein Konstruktor aufruf
Server::Server() : rsocket(socket)

//Meine Deklaration in der Klasse
sf::TcpSocket socket;
sf::TcpSocket &rsocket;
list<sf::TcpSocket> adresses;

//Aufruf in der Server.cpp
adresses.push_back(rsocket);


Wäre nett wenn mir jemand kurz helfen könnte, danke!
♥ SFML 2.0 Visual Express 2010 ♥

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

2

26.10.2012, 04:33

Wenn du Visual C++ 2010+ verwendest, kannst du einfach folgendes machen:

C-/C++-Quelltext

1
2
3
4
list<sf::TcpSocket> sockets;
sockets.emplace_back();

sf::TcpSocket& my_socket = sockets.back();  // Referenz auf dein Socket

Das Problem ist eben, dass sf::TcpSocket nicht kopierbar ist. D.h. du kannst nicht einfach ein Socket erzeugen und in die Liste kopieren. Stattdessen erzeugen wir eine Liste aus Sockets, konstruieren ein Socket direkt als Element in der Liste und verwenden dann das in der Liste erzeugte Objekt.

Flutschi

Treue Seele

  • »Flutschi« ist der Autor dieses Themas

Beiträge: 90

Wohnort: Schweiz

  • Private Nachricht senden

3

26.10.2012, 04:55

Vielen Dank, weist du warum es denn nicht kopierbar ist?


Edith sagt:

Hmm, irgendwas geht doch nich, was genau muss ich als Parameter übergeben bei emplace_back?


Seh ich das richtig so:

Network HPP

C-/C++-Quelltext

1
sf::TcpSocket socket;


Network CPP :: bei der Listen Funktion (also die die auf ne eingehende Connection wartet..)

C-/C++-Quelltext

1
2
sf::TcpSocket &socket = adresses.back();
adresses.emplace_back(jawaskommthierrein?); //Ich hab schon "socket" reingeschrieben, ghet nicht. hab auch schon &socket probiert, geht auch nicht..
♥ SFML 2.0 Visual Express 2010 ♥

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Flutschi« (26.10.2012, 05:10)


dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

4

26.10.2012, 04:56

Überleg mal, was genau rauskommen sollte, wenn man ein Socket kopiert... ;)

Flutschi

Treue Seele

  • »Flutschi« ist der Autor dieses Themas

Beiträge: 90

Wohnort: Schweiz

  • Private Nachricht senden

5

26.10.2012, 05:11

Überleg mal, was genau rauskommen sollte, wenn man ein Socket kopiert... ;)


Naja um ehrlich zu sein weis ich nichma was ein Socket ist, bin halt erst seit heute bissel am rumspielen und lernen. Aber merke schon da fehlt sehr vieles :D
♥ SFML 2.0 Visual Express 2010 ♥

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

6

26.10.2012, 05:18

emplace_back() bekommt in dem Fall keine Parameter, weil der Konstruktor von sf::TcpSocket keine bekommt, genau wie in meinem Codebeispiel oben.

Ein Socket repräsentiert einen Verbindungsendpunkt. Eine Netzwerkverbindung hat zwei Verbinungsendpunkte, einen bei dir und einen bei der Maschine, mit der du verbunden bist. Die Frage, was genau rauskommen sollte, wenn du die Hälfte einer Verbindung kopierst, lässt sich nicht sinnvoll beantworten; es macht keinen Sinn, ein Socket zu kopieren. Und daher ist es eben auch nicht kopierbar... ;)

Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von »dot« (26.10.2012, 05:47)


Flutschi

Treue Seele

  • »Flutschi« ist der Autor dieses Themas

Beiträge: 90

Wohnort: Schweiz

  • Private Nachricht senden

7

26.10.2012, 05:51

Das übersteigt mein wissen... bei mir verlangt er bei emplace_back ein argument, ka, muss ich morgen wohl mal anschaun was du genau da gefuchtelt hast :D

vielen Dank auf jedenfall schonmal.
♥ SFML 2.0 Visual Express 2010 ♥

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

8

26.10.2012, 06:04

Oh stimmt, emplace_back() funktioniert in VS 2010 noch nicht richtig, die entsprechenden Overloads gibts erst ab VS 2012. In dem Fall bleibt vermutlich nichts Anderes übrig, als die Sockets per new anzulegen und im Container nur Zeiger drauf zu speichern. Dabei würde ich dann aber anstatt einer std::list<sf::TcpSocket> einen std::vector<std::unique_ptr<sf::TcpSocket>> verwenden...

Flutschi

Treue Seele

  • »Flutschi« ist der Autor dieses Themas

Beiträge: 90

Wohnort: Schweiz

  • Private Nachricht senden

9

26.10.2012, 06:09

Aha aha, gut gut, vielen dank auf jedenfall, werd mir das alles morgen dann mal anschaun!
♥ SFML 2.0 Visual Express 2010 ♥

Werbeanzeige