boost asio: Problem mit Servererstellung in einer Klasse
-
Schon mal was von Initialisierungslisten gehört?
-
ja schon, hierfür find ich nur grade keinen ausweg das zum laufen zu bringen

-
Diese Antwort sagt mir nur eines: du weißt nicht was Initialisierungslisten sind!
-
Initialisierungen werden nicht in der Klasse durchgeführt, sondern in der Initialisierungsliste des Konstruktors. Das ist absolutes Grundlagenwissen über C++ Klassen.
http://de.wikipedia.org/wiki/Initialisierungsliste
http://tutorial.schornboeck.net/initliste.htmSchlag am besten nochmals den Teil über Klassen in deinem lieblings C++ Buch nach.
Übrigens, ich hoffe, dass du die Klasse
create_serv_comauf dem Heap erstellen wirst. Denn wenn nicht, sehe ich da schon den Stackoverflow auf dich zurasen. Die drei Puffer sind grundsätzlich unnötig und auch viel zu gross.Grüssli
-
boost::asio::io_service io_service_; tcp::acceptor acceptor( boost::asio::io_service io_service_, tcp::endpoint( tcp::v4() , 13 ) ) : io_service(io_service_);bringt auch nicht den gewünschten Erfolg:
Error 1 error C2751: 'boost::asio::ip::tcp::v4' : the name of a function parameter cannot be qualified 24 TCP Server
endpoint ist doch ein Funktionsaufruf. Wie mach ich das da denn?

EDIT:
tcp::socket socket(boost::asio::io_service io_service_) : io_service(io_service_);Error 8 error C2590: 'socket' : only a constructor can have a base/member initializer list 27 TCP Server
--> Naja ich erstelle doch ein Objekt. Nämlich socket.... Wie da kein Konstruktor aufgerufen

Wo muss kommt es denn evtl. zu einem Stackoverflow? Die Buffer waren natürlich nur zu Testzwecken da. Wollte gucken wieviel man verschicken kann, bis die Daten abgeholt werden... Ob Buffer letztendlich unnötig sind, kann ich noch nicht sehen.
Gruß
WAR][FIRE
-
Du hast immer noch keine Intialisierungsliste verwendet, sondern machst weiterhin nur irgendwelche Syntaxfehler.
Die Links sind da eigentlich Erklärung genug, wenn man sie richtig liest, ansonsten lies es in deinem lieblings C++ Buch nach. Grundlagenwissen muss man sich selber eintrichtern, wenn es einem andere immer nur Vorkauen, lernt man es nie. Und Initialisierungslisten sind wirklich was verdammt einfaches. Die gehören beim Konstruktor hin und wenn du nicht weisst, was der Konstruktor in einer C++ Klasse ist, dann solltest du vielleicht zuerst mal C++ lernen
Grüssli
-
Hmm..... Also ich habe echt keinen Ansatz wie ich das mit der Initialisierungsliste hinbekommen soll.
Mein Problem ist es das erstelle socket Objekt global zu bekommen, damit die Funktionen recv() und send() darauf zugreifen können.
Mit der Initialisierungslisten kann ich wohl Variablen direkt benennen und Objekte mit übergabeparametern erstellen, aber was ist wenn ich den eigentlichen Parameter schon in der Klasse erstellt habe?
Ich hab das Gefühl hier irgendwas nicht richtig zu schnallen

Ich denk mal weiter drüber nach. Denkanstoße wären aber evtl hilfreich

-
WAR][FIRE schrieb:
Denkanstoße wären aber evtl hilfreich

//main.cpp #include <iostream> class A { public: A(int wert): variable(wert) { } // <--- Konstruktor mit Initialisierungsliste int getVariable() const { return variable; } private: int variable; }; int main() { A instanz(5); std::cout << "Wert: " << instanz.getVariable() << std::endl; return 0; }
-
Ja, ich denke das habe ich jetzt verstanden. Aber das Konzept kann ich nicht auf mein Problem anwenden
hab bis jetzt auch keine Lösung gefunden.Ich habe ja keinen Übergabewert, bzw. doch aber dieser wert ist in der Klasse ja deklariert

-
Wenn du keinen Übergabwert hast, schreibste den halt selber hin!
//main.cpp #include <iostream> class A { public: A(): variable(5) { } // <--- Konstruktor mit Initialisierungsliste int getVariable() const { return variable; } private: int variable; }; int main() { A instanz; // keine Übergabewert std::cout << "Wert: " << instanz.getVariable() << std::endl; }Die Frage ist, ob du jetzt weißt, warum man das überhaupt braucht? Wahrscheinlich nicht...
-
//main.cpp #include <iostream> class A { public: A(): variable(5) { } // <--- Konstruktor mit Initialisierungsliste (Ok) klasse1 obj1; <--- Das ist ja mein Problem! klasse2 obj2(obj1); }; int main() { A instanz; // keine Übergabewert }So nun nochmal mein Problem vereinfacht dargestellt. Ich möchte keiner Variable einen Wert zuweisen. Ich möchte ein Objet, dass ich in der Klasse A erstelle (obj1) direkt weiter geben an das Objekt von Klasse2.
PS: Ich fang langsam an zu glauben das ich irgendwie zu blöd bin heute :p
Trotzdem danke für eure Bemühungen mir das einzutrichtern

-
So vielleicht

//main.cpp class klasse1 { public: klasse1(int wert = 0): variable(wert) { } // <--- Konstruktor mit Initialisierungsliste und Standardargument private: int variable; }; class klasse2 { public: klasse2(klasse1 obj): objekt(obj) { } // <--- Konstruktor mit Initialisierungsliste und "Übergabewert" private: klasse1 objekt; }; class A { public: A(): obj1(5), obj2(obj1) { } // <--- Konstruktor mit Initialisierungsliste private: klasse1 obj1; klasse2 obj2; }; int main() { A instanz; // kein Übergabewert }
-
WAR][FIRE! Dir ist schon bewusst, dass das hier ganz normal ist:
void foo() { int a(5); int b = 5; // das gleiche wie eine zeile drüber }
-
ich denke ich werde mich morgen ähhh heute nochmal damit beschäftigen -.-
Gruß
WAR][FIRE
-
So vielleicht bin ich des Rätsels Lösung schon etwas näher gekommen:
boost::asio::io_service io_service; tcp::acceptor acceptor2; tcp::socket socket2; create_serv_com( ) : acceptor2( io_service, tcp::endpoint(tcp::v4() , 13 )), socket2(io_service){}Fehler:
Error 1 error C2512: 'boost::asio::basic_socket_acceptor<Protocol>' : no appropriate default constructor available 47 TCP ServerIch denke soetwas in der Richtung probiert Ihr mir zu erzählen aber es geht immernoch nicht -.-
Gruß
WAR][FIRE
-
Ein Tip: wenn dir die Fehlermeldung nicht auf Anhieb klar ist, solltest du die MSDN zu Rate ziehen. Das Geniale am MSVC ist, das er Errorcodes mit gibt. In deinem Fall den C2512. Schau mal hier:
http://msdn.microsoft.com/de-de/library/9zkz8dx6(VS.80).aspx
Du initialisierst sowohl acceptor2 und socket2 mit einem parametrisierten Ctor-Aufruf. Was erstmal richtig ist und den Fehler nicht mehr bringen sollte. Ich denke mal du hast irgendwo einen Syntaxfehler. Kannst du etwas mehr code posten und sagen welche Zeile er ankreidet?
EDIT: kann es sein, das du vielleicht mal die io_service-Variable anders benennen solltest? Der kommt da mit dem gleichnamigen Typnamen io_service durcheinander!!! Die Variable vielleicht io_service2 o.ä. benennen.
-
ich hatte noch aus versehen eine Klasse drin die vererbt wurde!

Jetzt funktionierts endlich

Danke für die Hilfe!

Gruß
WAR][FIRE
-
Hallo!
Weiß jemand wie via. boost::asio die Verbindungsinformationen abfragen kann?
Finde in den asio references irgendwie nichts dazu.
nach
acceptor.accept(socket);Müssen ja Verbindungsinformationen zu Verfügung stehen. z.B. die IP des Verbundenen...
Gruß
WAR][FIRE