标签:多态应用
//#pragma once //#include<iostream> //#include<string> //Singleton.hpp //#include<list> //#include<assert.h> //#include<stdarg.h> //using namespace std; //struct BlockInfo //{ // void* _ptr; // string _file; // int _line; // BlockInfo(void *ptr, const char*file, int line) // :_ptr(ptr) // , _file(file) // , _line(line) // {} //}; //class SaveAdapter//适配器 //{ //public: // //可变参数列表 // //纯虚函数,抽象类,不能实例化出对象,继承的类应该重写此虚函数 // virtual void Save(const char* fmt, ...) = 0; //}; //class ConsoleSaveAdapter :public SaveAdapter //{ //public: // //显示在控制台,同理还可记入数据库中 // void Save(const char* fmt, ...) // { // va_list args; // va_start(args, fmt); // vfprintf(stdout, fmt, args); // va_end(args); // } //}; //class FileSaveAdapter :public SaveAdapter //{ //public: // FileSaveAdapter(const char* filename = "Memory.txt") // { // _fOut = fopen(filename, "w"); // } // //记录在文件 // void Save(const char* fmt, ...) // { // va_list args; // va_start(args, fmt); // vfprintf(_fOut, fmt, args); // va_end(args); // } // ~FileSaveAdapter() // { // fclose(_fOut); // } //protected: // FILE* _fOut; //}; ////单例模式 //class Singleton //{ //public: // static Singleton* GetInstance() // { // if (sInstance == NULL) // { // sInstance = new Singleton; // } // return sInstance; // } // void *Alloc(size_t size, const char* file, int line) // { // void* ptr = malloc(size); // if (ptr) // { // BlockInfo b(ptr, file, line); // GetInstance()->BlockList.push_back(b); // } // return ptr; // } // void Dalloc(void *ptr) // { // free(ptr); // //[) // list<BlockInfo>::iterator it = GetInstance()->BlockList.begin(); // while (it != GetInstance()->BlockList.end()) // { // if (it->_ptr == ptr) // { // GetInstance()->BlockList.erase(it); // return; // } // ++it; // } // assert(false); // } // //静态成员函数没有this指针 // //静态函数里面不能调用非静态函数,没有this指针传过去 // static void Print() // { // cout << "内存泄漏的内存块" << endl; // list<BlockInfo>::iterator it = GetInstance()->BlockList.begin(); // while (it != GetInstance()->BlockList.end()) // { // printf("ptr:%p file:%s line:%d\n", it->_ptr, it->_file.c_str(), it->_line); // ++it; // } // } // void Persistent() // { // ConsoleSaveAdapter csa; // Singleton::GetInstance()->_Persistent(&csa); // FileSaveAdapter fsa; // Singleton::GetInstance()->_Persistent(&fsa); // } //private: // void _Persistent(SaveAdapter* sa)//单例模式此时应传父类指针或引用 // { // std::list<BlockInfo>::iterator it = GetInstance()->BlockList.begin(); // while (it != GetInstance()->BlockList.end()) // { // sa->Save("ptr:%p, file:%s, line:%d\n", it->_ptr, it->_file.c_str(), it->_line);//运用的是多态 // ++it; // } // } // Singleton() // {} // Singleton(const Singleton& s); // Singleton& operator=(const Singleton& s); //protected: // static Singleton* sInstance; // list<BlockInfo> BlockList; //}; //template<class T> //T *__NEW(size_t num, const char* file, int line) //{ // T *ptr = (T*)(Singleton::GetInstance()->Alloc(sizeof(T)*num, file, line)); // if (TypeTraits <T>::__IsPODType().Get()) // return ptr; // else // return new(ptr)T; //} //template<class T> //void __DELETE(T *ptr) //{ // if (!TypeTraits <T>::__IsPODType().Get()) // ptr->~T(); // Singleton::GetInstance()->Dalloc(ptr); //} //template<class T> //T *__NEW_ARRAY(size_t num, const char* file, int line) //{ // size_t size = sizeof(T)*num; // T* ptr = NULL; // if (TypeTraits <T>::__IsPODType().Get()) // { // ptr = (T*)(Singleton::GetInstance()->Alloc(size, file, line)); // return ptr; // } // else // { // size += 4; // ptr = (T*)(Singleton::GetInstance()->Alloc(size, file, line)); // *((int*)ptr) = num; // T* cur = (T*)((int*)ptr + 1); // for (size_t i = 0; i < num; i++) // { // new(&cur[i])T;//如果是基本类型则不执行,直接跳过 // } // return cur; // } // //} //template<class T> //void __DELETE_ARRAY(T* ptr) //{ // if (TypeTraits <T>::__IsPODType().Get()) // { // Singleton::GetInstance()->Dalloc(ptr); // } // else // { // int num = *((int*)ptr - 1); // for (int i = 0; i < num; i++) // { // ptr[i].~T(); // } // Singleton::GetInstance()->Dalloc((void*)((int*)ptr - 1)); // } // //} //struct __TrueType //{ // bool Get() // { // return true; // } //}; // //struct __FalseType //{ // bool Get() // { // return false; // } //}; // //template <class _Tp> //struct TypeTraits //{ // typedef __FalseType __IsPODType; //}; // //template <> //struct TypeTraits< bool> //{ // typedef __TrueType __IsPODType; //}; // //template <> //struct TypeTraits< char> //{ // typedef __TrueType __IsPODType; //}; //template <> //struct TypeTraits< int> //{ // typedef __TrueType __IsPODType; //}; // //#define NEW(type) __NEW<type>(1,__FILE__,__LINE__) //#define DELETE(ptr) __DELETE(ptr) //#define NEW_ARRAY(type,num) __NEW_ARRAY<type>(num,__FILE__,__LINE__) //#define DELETE_ARRAY(ptr) __DELETE_ARRAY(ptr)//模板类型根据传过去参数自己推演类型 //Singleton* Singleton::sInstance = NULL; ////测试用例 //#include<iostream> //using namespace std; //#include"Singleton.hpp" ////自定义类型数组 //void Test4() //{ // string* p1 =NEW_ARRAY(string, 5); // p1[0] = "abc"; // p1[1] = "def"; // p1[2] = "xxx"; // p1[3] = "lll"; // p1[4] = "www"; // cout << p1->c_str() << endl; // DELETE_ARRAY(p1); //} //int main() //{ // Test4(); // //登记一个函数在main函数执行结束以后执行,函数限制void Func(void) // Singleton::GetInstance()->Persistent(); // atexit(Singleton::Print); // system("pause"); // return 0; //}
本文出自 “小止” 博客,请务必保留此出处http://10541556.blog.51cto.com/10531556/1729564
标签:多态应用
原文地址:http://10541556.blog.51cto.com/10531556/1729564