Eigene Klasse in wxwidgets



  • Hi,
    ich will eine eigene Klasse erstellen die von einer wxWidgets klasse erbt.
    Doch ich stoße auf einige Probleme bei denen ich Hilfe brauche.

    class socketServer: public wxSocketServer{
    	public:
    		socketServer(const wxString &Host = "127.0.0.1", unsigned short Port = 3000)
    			:Serveraddr.Hostname(Host), Serveraddr.Service(Port) {};
    
    		wxSocketBase AcceptSocket;
    		wxSocketServer Socket;
    		wxIPV4address Serveraddr;		
    };
    

    Ich bekomme immer

    error C2512: 'wxSocketServer': Kein geeigneter Standardkonstruktor verfügbar

    Woran liegt es?



  • http://www.wxwindows.org/manuals/stable/wx_wxsocketserver.html

    wxSocketServer verlangt 2 (mind. 1) Parameter beim Konstruktur.
    Du musst also bei der Initialisierungsliste den Konstruktor von wxSocketServer aufrufen..

    Also so:

    class socketServer: public wxSocketServer{
        public:
            socketServer(const wxString &Host = "127.0.0.1", unsigned short Port = 3000)
                :Serveraddr.Hostname(Host), Serveraddr.Service(Port), wxSocketServer(/* parameter */); 
                {};
    
            wxSocketBase AcceptSocket;
            wxSocketServer Socket;
            wxIPV4address Serveraddr;       
    };
    


  • Hi,
    hatte ich mir gedacht und auch schon etwas rumprobiert.

    class socketServer: public wxSocketServer{
    	public:
    		socketServer(const wxString &Host = "127.0.0.1", unsigned short Port = 3000)
    			:Serveraddr.Hostname(Host), Serveraddr.Service(Port), wxSocketServer(address, flags = wxSOCKET_NONE) {};
    
    		wxSocketBase AcceptSocket;
    		wxSocketServer Socket;
    		wxIPV4address Serveraddr;		
    };
    

    Geht leider nicht...

    error C2059: Syntaxfehler: '.'
    error C2512: 'wxSocketServer': Kein geeigneter Standardkonstruktor verfügbar


  • Mod

    Mitbewohner schrieb:

    :Serveraddr.Hostname(Host), Serveraddr.Service(Port), wxSocketServer(address, flags = wxSOCKET_NONE) {};
    

    So geht das nicht. Du kannst elemente nur direkt intialisieren, aber nicht funktionen aufrufen. Serveraddr hat also entweder einen Konstruktor für Host und Port, oder du müsstest das im Body machen.
    Und du kannst keine Defaultparameter angeben. wxSocketServer(address) oder wxSocketServer(address,wxSOCKET_NONE).

    Und wenn du von wxSocketServer ableitest, dann brauchst du nicht noch eine Variable davon in der Klasse.



  • Wenn ich in VS den Inhalt und die Vererbten Elemente anzeigen lasse,
    sehe ich nichts in der art von

    wxIPV4address address;

    class socketServer: public wxSocketServer{
    	public:
    		socketServer(const wxString &Host = "127.0.0.1", unsigned short Port = 3000)
    			:wxSocketServer(address)
    		{
    		Serveraddr.Hostname(Host);
    		Serveraddr.Service(Port);
    		};
    
    		wxSocketBase AcceptSocket;
    		wxSocketServer Socket;
    		wxIPV4address Serveraddr;		
    };
    

    error C2065: 'address': nichtdeklarierter Bezeichner
    error C2512: 'wxSocketServer': Kein geeigneter Standardkonstruktor verfügbar


  • Mod

    Lies doch bitte mal die Doku und schau dir die Socket FAQ im wxForum an. Und bei den wx-Samples ist auch ein SocketServer dabei.

    Ich würds so machen:

    class Server : public wxSocketServer
    {
       Server(wxIP4Address address):wxSocketServer(address)
       {}
    };
    

    phlox



  • Du solltest evtl. auch nochmal einen Blick auf allgemeine C++ Literatur werfen, die das Thema Vererbung und Überladen von Methoden (insbesondere Konstruktoren) behandelt.


Anmelden zum Antworten