分类: C/C++
2008-08-01 16:53:56
查找(CFind)是一个概念,作用于特定的数据(CData),因为数据有各种不同的特性,有排序了的(CDataSorted),和没有排序过的(CDataChaos),对于不同特性的数据,应该应用不同的查找方法,
对于排序过的数据(CDataSorted),应该使用一种查找方法(CFindBinarySearch), 对于没有排序过的数据(CDataChaos),应该使用另一种查找方法(CFindWorker),
呵呵,所以产生了如下的类图:
---------- ------- CFind <>------------------------ CData - ------ - --- --- ^ ^ ^ ^ ^ -------- ------ ^ ^ ^ ^ ----------- - - ----------------- ----- ------- --- -------- CFindWorker CFindBinarySearch CDataSorted CDataChaos ------------- ------------------- ------------- ------------这样的话,用户就可以通过派生CData类来加入新的存储格式的数据,通过派生CFind类来加入新的查找方法了, 不过,一般来说,查找方法都是和数据存储方式紧密耦合的,所以,嘿嘿嘿,..., 请注意我的目的呀,我只是为了练习C 才这样写的,哈哈:) 我想一定会有很多人大骂我白痴的吧,哈哈哈哈~~哈哈哈哈,就当耳旁风,不听。:)
数据的基类:(每个类的实现请在本文提供的源代码中查找)
class CData { public: CData(); CData(int iNum, int iMax); // generate the data : _v virtual ~CData(){}; CData(const CData& rhs); void get_data(vector& v); protected: vector _v; private: CData& operator=(const CData& rhs); const int _iMin; };排序数据类:
class CDataSorted : public CData { public: CDataSorted(CData rhs); virtual ~CDataSorted(){}; private: CDataSorted(); CDataSorted& operator=(const CDataSorted& rhs); };原始数据类:
class CDataChaos : public CData { public: CDataChaos(CData rhs); virtual ~CDataChaos(){}; private: CDataChaos(); CDataChaos& operator=(const CDataChaos& rhs); };查找的基类:
class CFind { public: CFind(const CData& data); virtual ~CFind(); virtual bool to_find(int elem, int& num); protected: CData* _pdata; private: CFind& operator=(const CFind& rhs); CFind(); };常规查找类:
class CFindWorker : public CFind { public: CFindWorker(const CData& data); virtual ~CFindWorker(){}; virtual bool to_find(int elem, int& num); private: CFindWorker(); };二分查找类:
class CFindBinarySearch : public CFind { public: CFindBinarySearch(const CData& data); virtual ~CFindBinarySearch(){}; virtual bool to_find(int elem, int& num); private: CFindBinarySearch(); // BINARY SEARCH };全局方法:
void g_find(CFind* pFind, int elem) { int num = 0; if ( pFind->to_find(elem, num) ) { cout << "\tfound " << elem << " by " << num << " times." << endl; } else { cout << "\tNOT found " << elem << " by " << num << " times!" << endl; } cout << endl; } void g_answer(CData* pData, int elem) { // VC 6 IDE -- add "/GR" to settings if ( dynamic_cast(pData) ) { CFindBinarySearch* pBin = new CFindBinarySearch(*pData); g_find(pBin, elem); delete pBin; } else { CFindWorker* pWorker = new CFindWorker(*pData); g_find(pWorker, elem); delete pWorker; } }
CData* pData = new CData(1000, 2000); CDataChaos* pDataChaos = new CDataChaos(*pData); CDataSorted* pDataSorted = new CDataSorted(*pData); cout << "/- SORTED DATA -/"; g_answer( pDataSorted, 2); cout << "/- CHAOS DATA -/"; g_answer( pDataChaos, 2); cout << "/- SORTED DATA -/"; g_answer( pDataSorted, 1000); cout << "/- CHAOS DATA -/"; g_answer( pDataChaos, 1000); delete pDataSorted; delete pDataChaos; delete pData;可能的执行结果: