三个文件:socket_include.h 、socket.h 、socket.cpp;
//socket_include.h
#ifndef _SOCKETS_socket_include_H
#define _SOCKETS_socket_include_H
#define _SOCKETS_socket_include_H
// class WSAInitializer is a part of the Socket class (on win32)
// as a static instance - so whenever an application uses a Socket,
// winsock is initialized
class WSAInitializer // Winsock Initializer
{
public:
WSAInitializer() {
if (WSAStartup(0x101,&m_wsadata))
{
exit(-1);
}
}
~WSAInitializer() {
WSACleanup();
}
private:
WSADATA m_wsadata;
};
// as a static instance - so whenever an application uses a Socket,
// winsock is initialized
class WSAInitializer // Winsock Initializer
{
public:
WSAInitializer() {
if (WSAStartup(0x101,&m_wsadata))
{
exit(-1);
}
}
~WSAInitializer() {
WSACleanup();
}
private:
WSADATA m_wsadata;
};
//Socket.h
#ifndef _SOCKETS_Socket_H
#define _SOCKETS_Socket_H
#define _SOCKETS_Socket_H
#include "socket_include.h"
class Socket
{
..............
{
..............
#ifdef _WIN32
static WSAInitializer m_winsock_init; //< Winsock initialization singleton class
#endif
static WSAInitializer m_winsock_init; //< Winsock initialization singleton class
#endif
..............
}
//Socket.cpp
#include "Socket.h"
// statics
#ifdef _WIN32
WSAInitializer Socket::m_winsock_init;
#endif
#ifdef _WIN32
WSAInitializer Socket::m_winsock_init;
#endif
通过在Socket.h中声明
static WSAInitializer m_winsock_init
把类WSAInitializer实现单例模式!