编译器需支持c++11,已在win7下用vs2013,linux下测试,win中用cmake生成相应的*.sln文件,在linux下用cmake生成相应的Makefile文件
该文章有以下几个学习点:
1、单例模式:
创建单例对象为什么用静态对象,而不是new 呢?
2、设计模式之观察者模式
3、如果是服务端,如果有地方用到大量的if else 或者switch,可以用该思路实现
另外该实现有点类似于qt的signal/slot :)
以下是栗子了:
*********分割线********************************************************************************************************************
创建route_manager.h文件
#ifndef _H_ROTE_MANAGER_H_
#define _H_ROTE_MANAGER_H_
#include <unordered_map>
#include <functional>
class RouteManager
{
public:
RouteManager();
~RouteManager();
public:
void RegisteHandler(int cmd, std::function<void(const char*)> fun);
void SetData(int cmd, const char* szData);
private:
std::unordered_multimap<int, std::function<void(const char*)>> m_routeMap;
};
*********分割线********************************************************************************************************************
创建 route_manager.cpp文件
#include "route_manager.h"
RouteManager::RouteManager()
{
}
RouteManager::~RouteManager()
{
}
void RouteManager::RegisteHandler(int cmd, std::function<void(const char*)> fun)
{
m_routeMap.emplace(cmd, fun);
}
void RouteManager::SetData(int cmd, const char* szData)
{
auto itRange = m_routeMap.equal_range(cmd);
for(auto it = itRange.first; it != itRange.second; ++it)
{
std::function<void(const char*)> fun = (*it).second;
fun(szData);
}
}
*********分割线********************************************************************************************************************
创建公共文件 public.h,单例
#ifndef _H_PUBIC_H_
#define _H_PUBIC_H_
template<class T>
class Singleton
{
public:
static T& GetInstance()
{
if(!m_instance)
{
static T _instance;
m_instance = &_instance;
}
return *m_instance;
}
private:
Singleton();
Singleton(const Singleton&);
Singleton& operator = (const Singleton&);
static T *m_instance;
};
template<class T>
T* Singleton<T>::m_instance = nullptr;
#endif
*********分割线********************************************************************************************************************
创建 main.cpp,测试class
#include "stdio.h"
#include "stdlib.h"
#include "route_manager.h"
#include "public.h"
class TestA
{
public:
TestA(){}
~TestA(){}
void Print(const char* szData)
{
printf("TestA.Print: %s\n", szData);
}
};
class TestB
{
public:
TestB(){}
~TestB(){}
void Print(const char* szData)
{
printf("TestB.Print: %s\n", szData);
}
void SetData(const char* szData)
{
printf("TestB.SetData: %s\n", szData);
}
};
#define g_routeManager Singleton<RouteManager>::GetInstance()
int main(int argc, char** argv)
{
printf("Hello !\n");
TestA a;
TestB b;
g_routeManager.RegisteHandler(1, std::bind(&TestA::Print, &a, std::placeholders::_1));
g_routeManager.RegisteHandler(2, std::bind(&TestB::Print, &b, std::placeholders::_1));
g_routeManager.RegisteHandler(2, std::bind(&TestB::SetData, &b, std::placeholders::_1));
g_routeManager.SetData(1, "Test: Hello !");
g_routeManager.SetData(2, "Test: Hello !");
getchar();
return 0;
}
*********分割线********************************************************************************************************************
CMakeLists.txt文件
PROJECT(ROUTE_DATA)
if(WIN32)
CMAKE_MINIMUM_REQUIRED(VERSION 2.8)
endif()
if(UNIX)
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")
endif()
#SET(SRC_LIST src/main.cpp)
AUX_SOURCE_DIRECTORy(src SRC_LIST)
ADD_EXECUTABLE(routeDataTest ${SRC_LIST})
*********分割线********************************************************************************************************************
欢迎加入QQ群(565993954)进行c++技术交流 ^!^ ,可在以下链接下载源码:http://download.csdn.net/detail/shaosheng2008/9829377