Skip to content

Instantly share code, notes, and snippets.

@r2p2
Created September 24, 2011 08:01
Show Gist options
  • Save r2p2/1239094 to your computer and use it in GitHub Desktop.
Save r2p2/1239094 to your computer and use it in GitHub Desktop.
class AbstractSocket
{
public:
AbstractSocket()
:m_i(0)
{
}
virtual void connect_to_host()
{
}
virtual void listen_on_socket(int i)
{
m_i = i;
}
int m_i;
};
class AbstractSocketClient : private AbstractSocket
{
public:
AbstractSocketClient()
:AbstractSocket()
{
}
virtual void listen_on_socket(int i)
{
AbstractSocket::listen_on_socket(i);
}
private:
// void connect_to_host(); // nicht für client sockets!!! braucht nicht
// private gesetzt werden, da ASC privat von AS erbt
};
class TcpSocket : AbstractSocket
{
public:
TcpSocket()
:AbstractSocket()
{
}
};
class TcpSocketClient : public AbstractSocketClient, public TcpSocket
{
public:
TcpSocketClient()
: AbstractSocketClient()
, TcpSocket()
{
}
};
/*
Ziel ist die Erstellung einer ServerSocket-Klasse, welche, wenn sich Clients mit dem Server
verbinden, ClientSocket-Klassen start. Was für ein Client-Socket benötigt wird, wird über
ein Template festgelegt.
Der Endanwender muss von TcpSocketClient erben und seine Aktion auf eingehende Nachrichten
implementieren. Um sicher zu stellen, dass nicht irgendetwas als Template übergeben wird,
wollte ich Polymorphie mit Templates verheiraten. Da man ja leider keine Referenzen auf
Klassennamen erzeugen kann.
Würde man ohne Template arbeiten wollen, müsste man zusätzlich noch von ServerSocket erben
und den gewünschten ClientSocket selbst erzeugen.
ServerSocket<TimeServerClient> timeserver;
timeserver.listen(1409);
*/
template<class ClientSocketType>
class ServerSocket
{
public:
ServerSocket()
{
}
void new_asc()
{
m_asc = new ClientSocketType();
}
// nur für den test
AbstractSocketClient* getASC()
{
return m_asc;
}
AbstractSocketClient *m_asc;
};
int main()
{
ServerSocket<TcpSocketClient> ss;
ss.new_asc();
//ss.getASC()->connect_to_host(); funktioniert nicht (gewünscht!)
ss.getASC()->listen_on_socket(1234);
return 0;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment