Probleme beim Casting von Struktur in Klassen [gelöst]



  • Hi. Ich bin mir nicht sicher, ob der Titel richtig gewählt ist, aber gut...

    Also, ich möchte eine Struktur namens sockaddr_in in einer Klasse als "private" deklarieren und von sockaddr_in in sockaddr* casten (in der Parameterliste der Methode).

    Das Casten funktioniert in der main() Funktion - wenn die Struktur auch in ihr deklariert ist - auch prächtig, aber in Parameterlisten von Methoden scheint das nicht gerade vergleichbar einfach zu sein.
    Ich habe es mittels dynamic_cast und dem C-Castoprator () versucht, aber beide Versuche schlugen fehl.

    Hat jemand einen Tip für mich?



  • Hier meine Klasse:

    PS.: Durchgehend großgeschriebene Kommentare sollen mein Anliegen verdeutlichen.

    SERVER_H:

    #ifndef _SERVER_
    #define _SERVER_
    #include <iostream>
    #include <winsock.h>
    
    using namespace std;
    
    class SERVER
    {
    private:
    	WSADATA wsa;
            // HIER HÄTTE ICH GERNE DIE DEKLARATION struct sockaddr_in srv, cli;
    public:	
    	SOCKET s, c;
    	int cli_size;
    	SERVER();
    	~SERVER();
    	bool sockInit();
    	bool buildSock();
    	bool zuhoeren();
    };
    #endif
    

    SERVER_CPP:

    #include "SERVER.h"
    
    SERVER::SERVER() 
    {}
    SERVER::~SERVER()
    {
    	closesocket(s);
    }
    // UND HIER SOLLTE DIE DEFINITION EINER METHODE ZUR UEBERNAHME DER AUFGABE HIN, 
    //DIE ICH - MANGELS PROGRAMMIERERFAHRUNG - IN MAIN GELOEST HABE. SIEHE NAECHSTE ZEILEN
    //srv.sin_addr.s_addr = INADDR_ANY;
    //srv.sin_port = htons( (unsigned short int) atol(argv[1]));
    //srv.sin_family = AF_INET;
    bool SERVER::sockInit()
    {
    		    /* initialize windows sockets */
        if (WSAStartup(MAKEWORD(1, 1), &wsa))
        {
            cout << "WSAStartup() failed: " << (unsigned long)GetLastError() << endl;
            return EXIT_FAILURE;
        }
    	cli_size = sizeof(sockaddr_in);
    	return true;
    }
    
    bool SERVER::buildSock()
    {
    	s = socket(AF_INET, SOCK_STREAM, 0);
    	if (s == -1)
    	{
    		cerr << "socket() failed" << endl;
    	}
    	return true;
    }
    //[...]
    
    int main(int argc, char *argv[])
    {
    	long a;
    	struct sockaddr_in srv, cli;
    	SERVER ser;
    	ser.sockInit();
            //[...]
    	srv.sin_addr.s_addr = INADDR_ANY;
    	srv.sin_port = htons( (unsigned short int) atol(argv[1]));
    	srv.sin_family = AF_INET;
    	if (bind(ser.s, (struct sockaddr*)&srv, sizeof(srv)) == -1) // <---- HIER HABE ICH ES NUN UMSTAENDLICH 
    // LOESEN MUESSEN, DA DAS CASTEN IN DER KLASSE NICHT FUNKTIONIERT HAT
    //[...]
    


  • Zeig mal wie du das casten versucht hast. Und "funktioniert nicht" ist keine wirkliche Fehlermeldung. Schreib also bitte die Versuche auf die du schon hattest und welche Fehlermeldungen dabei rauskommen.



  • skullyan schrieb:

    Das Casten funktioniert in der main() Funktion - wenn die Struktur auch in ihr deklariert ist - auch prächtig, aber in Parameterlisten von Methoden scheint das nicht gerade vergleichbar einfach zu sein.

    Wie meinst du das? Also in der Parameterliste einer Funktion/Methode kannst du natürlich nicht explizit casten (wäre ja auch Quatsch), das wird höchstens (eventuell) implizit gemacht, z.B. wenn du für einen long-Parameter einen int.Wert übergibst. Wenn du an deine Methode eine Variable vom 'falschen' Typ bekommst, kannst du sie aber innerhalb der Methode casten (wenn das so sinnvoll ist).



  • _matze schrieb:

    skullyan schrieb:

    Das Casten funktioniert in der main() Funktion - wenn die Struktur auch in ihr deklariert ist - auch prächtig, aber in Parameterlisten von Methoden scheint das nicht gerade vergleichbar einfach zu sein.

    Wie meinst du das? Also in der Parameterliste einer Funktion/Methode kannst du natürlich nicht explizit casten (wäre ja auch Quatsch), das wird höchstens (eventuell) implizit gemacht, z.B. wenn du für einen long-Parameter einen int.Wert übergibst. Wenn du an deine Methode eine Variable vom 'falschen' Typ bekommst, kannst du sie aber innerhalb der Methode casten (wenn das so sinnvoll ist).

    Stimmt auch. Das bringt mich auf eine Idee.
    this->(sockaddr*)srv

    Kann ich das so innerhalb einer Methode einer Subroutine übergeben?
    Hier habe ich es in der main Funktion ja auch gemacht:

    bind(ser.s, (struct sockaddr*)&srv, sizeof(srv))



  • skullyan schrieb:

    this->(sockaddr*)srv

    Du meinst wohl eher (sockaddr*)this->srv ?



  • _matze schrieb:

    skullyan schrieb:

    this->(sockaddr*)srv

    Du meinst wohl eher (sockaddr*)this->srv ?

    Ja genau, ist das machbar?



  • skullyan schrieb:

    _matze schrieb:

    skullyan schrieb:

    this->(sockaddr*)srv

    Du meinst wohl eher (sockaddr*)this->srv ?

    Ja genau, ist das machbar?

    Wenn der Cast bei der Übergabe klappt, warum sollte er 'dahinter' nicht auch klappen? Probier es doch einfach mal.



  • _matze schrieb:

    skullyan schrieb:

    _matze schrieb:

    skullyan schrieb:

    this->(sockaddr*)srv

    Du meinst wohl eher (sockaddr*)this->srv ?

    Ja genau, ist das machbar?

    Wenn der Cast bei der Übergabe klappt, warum sollte er 'dahinter' nicht auch klappen? Probier es doch einfach mal.

    Jo, geht. Danke!
    👍


Anmelden zum Antworten