青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

積木

No sub title

  C++博客 :: 首頁 :: 聯(lián)系 :: 聚合  :: 管理
  140 Posts :: 1 Stories :: 11 Comments :: 0 Trackbacks

常用鏈接

留言簿(1)

我參與的團隊

搜索

  •  

最新評論

閱讀排行榜

評論排行榜

#

說明:相關技術參考自:http://www.cublog.cn/u/18517/showart_241240.html
上面這個,寫的真的很不錯,通俗易懂。推薦大家去看下。下面是看完上面的文章后,自己嘗試的:
//智能指針聲明及實現

/************************************************************************/
/** 智能指針聲明
/***********************************************************************
*/

#pragma once

#include 
<iostream>
#include 
<stdexcept>
using namespace std;

#ifndef TEST_SMARTPTR
#define TEST_SMARTPTR
#endif

template 
< class T >
class TSmartPtr
{
public:
    
//默認構造函數
    TSmartPtr(T* pTObject = NULL) : m_pTObject(pTObject), m_pCount(new int(1)) {}
    
//拷貝構造函數
    TSmartPtr(const TSmartPtr& src) : m_pTObject(src.m_pTObject), m_pCount(src.m_pCount) { ++(*m_pCount); }
    
//析構函數
    virtual ~TSmartPtr()
    {
#ifdef TEST_SMARTPTR
        cout 
<< "SmartPtr Object Free." << endl;
#endif
        DoDecUseCount();
    }
    
//=重載
    TSmartPtr& operator = (const TSmartPtr& rhs)
    {
        
// self-assigning is also right
        ++*rhs.m_pCount;    //源智能指針的引用計數增1
        DoDecUseCount();    //目標智能指針的引用計數減1。此非常有必要。因為該指針既然要指向rhs,
                            
//則說明它就不再想去管理自身原本的指針對象了。因此需要減1()
                            
//在自身引用計數減1后,有可能自身原本維護的指針對象會被釋放掉,也有可能不會。
                            
//(因為,先前所管理的對象,有可能還有其他的智能指針對象在維護著了。)
                            
//因此,上面這兩句才是精髓。
        m_pTObject = rhs.m_pTObject;
        m_pCount 
= rhs.m_pCount;
        
return *this;
    }
    
//->重載
    T* operator -> ()
    {
        
if (NULL != m_pTObject)
            
return m_pTObject;
        
throw runtime_error("access through NULL pointer");
    }
    
const T* operator -> () const
    {
        
if (NULL != m_pTObject)
            
return m_pTObject;
        
throw runtime_error("access through NULL pointr");
    }
    
//*重載
    T& operator * ()
    {
        
if (NULL != m_pTObject)
            
return *m_pTObject;
        
throw runtime_error("dereference of NULL pointer");
    }
    
const T& operator * () const
    {
        
if (NULL != m_pTObject)
            
return &m_pTObject;
        
throw runtime_error("dereference of NULL pointer");
    }
private:
    
//引用計數減1
    void DoDecUseCount(void)
    {
        
if (0 == --*m_pCount)
        {
            
if (NULL != m_pTObject)
            {
                delete m_pTObject;
                m_pTObject 
= NULL;
            }
            delete m_pCount;
            m_pCount 
= NULL;
        }
    }
    T
*        m_pTObject;
    
int*    m_pCount;
}

//調用
/************************************************************************/
/** 智能指針
/***********************************************************************
*/

// SmartPointerStu.cpp : Defines the entry point for the console application.
//

#include 
"stdafx.h"

#include 
"SmartPointer.h"
#include 
<iostream>
using namespace std;

//一個測試智能指針的類
class CMyTestClass
{
public:
    CMyTestClass() { cout 
<< "A CMyTestClass Object was created." << endl; }
    
virtual void Print(void) { cout << "CMyTestClass Print()." << endl; }
    
virtual void Show(void) { cout << "CMyTestClass Show()." << endl; }
    
~CMyTestClass() { cout << "A CMyTestClass Object was destroied." << endl; }
};

class CMyTestSubClass : public CMyTestClass
{
public:
    CMyTestSubClass() { cout 
<< "A CMyTestSubClass Object was created." << endl; }
    
virtual void Print(void) { cout << "CMyTestSubClass Print()." << endl; }
    
void SubShow(void) { cout << "Sub Show()." << endl; }
    
~CMyTestSubClass() { cout << "A CMyTestSubClass Object was destroied." << endl; }
};

int _tmain(int argc, _TCHAR* argv[])
{
    
try
    {
        TSmartPtr
<CMyTestClass> t;    //因為沒有給t傳個CMyTestClass對象的指針參數進去。所以會出異常。
        t->Print();
    }
    
catch(const exception& err)
    {
        cout 
<< err.what() << endl;
    }
    
//上面這個已經測試通過了。結果正確。
    
//--------------------------------------
    TSmartPtr<CMyTestClass> t1(new CMyTestClass);
    t1
->Print();
    
//上面這個測試->重載的操作符的正確性。測試結果是正確的。
    TSmartPtr<CMyTestClass> t2(t1);
    t2
->Print();
    
//上面這個測試拷貝構造函數的正確性。測試結果是正確的。
    TSmartPtr<CMyTestClass> t3(new CMyTestClass);
    t3 
= t2;
    (
*t3).Print();
    
//上面這個測試=重載的操作符的正確性。測試結果也是正確的。

    TSmartPtr
<CMyTestSubClass> ts4(new CMyTestSubClass);
    ts4
->Print();
    ts4
->SubShow();
    ts4
->Show();
    TSmartPtr
<CMyTestSubClass> ts5(ts4);
    ts5
->SubShow();
    TSmartPtr
<CMyTestSubClass> ts6 = ts5;
    ts6
->Print();
    
//上面測試一下帶有繼承關系的類指針對象的智能指針使用。測試結果也是正確的。

    system(
"pause");
    
return 0;
}

posted @ 2011-06-29 10:48 Jacc.Kim 閱讀(220) | 評論 (0)編輯 收藏

// TemplateStu.cpp : Defines the entry point for the console application.
//

#include 
"stdafx.h"

#include 
<iostream>
using namespace std;


/************************************************************************/
/** 函數模板
/***********************************************************************
*/
template
<class T>
T min___(T t1, T t2)
{
    
return t1 < t2 ? t1 : t2;
}

template
<typename T>
T max___(T t1, T t2)
{
    
return t1 > t2 ? t1 : t2;
}

/************************************************************************/
/** 類模板
/***********************************************************************
*/
template
<class TA, class TB>
class TShowClass
{
private:
    TA
* m_pObjA;
    TB
* m_pObjB;
public:
    TShowClass(TA
* pA, TB* pB);
    
void Show(void);
};

//類模板的構造函數
template<class TA, class TB>
TShowClass
<TA, TB>::TShowClass(TA* pA, TB* pB)
{
    
this->m_pObjA = pA;
    
this->m_pObjB = pB;
}

//Show函數
template<class TA, class TB>
void TShowClass<TA, TB>::Show()
{
    
int addA = 10000;
    
int addB = 20000;
    cout 
<< addA << endl;
    cout 
<< addB << endl;
}

class CClassA
{

};
class CClassB
{

};



int _tmain(int argc, _TCHAR* argv[])
{
/************************************************************************/
/** 函數模板的調用(其實就跟變通模板的調用是一樣的)
/***********************************************************************
*/
    
int i = 10, j = 11;
    
float f1 = 9.0f, f2 = 11.1f;
    
char c1 = 'b', c2 = 'Q';
    cout 
<< min___(i, j) << endl;
    cout 
<< min___(f1, f2) << endl;
    cout 
<< min___(c1, c2) << endl;

    cout 
<< endl;
    cout 
<< max___(i, j) << endl;
    cout 
<< max___(f1, f2) << endl;
    cout 
<< max___(c1, c2) << endl;


/************************************************************************/
/** 類模板的調用
/***********************************************************************
*/
    CClassA ObjA;
    CClassB ObjB;
    
//TShowClass<CClassA, CClassB> ShowClassObj(&ObjA, &ObjB);
    
//ShowClassObj.Show();
    
//上面兩行調用是OK的?,F在再試下創(chuàng)建一個類模板的指針對象
    typedef TShowClass<CClassA, CClassB> TSC;
    TSC
* pShowClassObj = new TSC(&ObjA, &ObjB);
    pShowClassObj
->Show();
    delete pShowClassObj;
    pShowClassObj 
= NULL;


/************************************************************************/
/** 模板使用總結:
/**    1) 不論是函數模板還是類模板。都必須以:template<class TA[, class TB, ]>[的內容是可選的,但至少要有一個]
/** 2) 對于函數模板,則自1)步驟后,剩下的同寫一個普通函數的步驟是一模一樣的。
/** 3) 對于類模板,則自1)步驟后,剩下的同寫一個普通的類的步驟是一模一樣的。
/** 4) 對于類模板,它們的具體cpp實現,需要注意:普通類的實現前只是需要加上返回類型及類型前綴即可。而
/**    對類模板的具體實現卻是:
/**    template<class TA, class TB>
/**    TShowClass<TA, TB>::TShowClass(TA* pA, TB* pB){  }
/**    與
/**    template<class TA, class TB>
/**    void TShowClass<TA, TB>::Show(){  }
/**    也就是說,cpp的具體實現的前綴不是以前的類類型,而是類模板類型
/**    
/** 5) 擴展:按上面的測試及理解,說明智能指針,則是在類模板內部維護一個具體實現對象的指針。詳細見智能指針的學習演示
/***********************************************************************
*/

    system(
"pause");
    
return 0;
}

posted @ 2011-06-28 12:03 Jacc.Kim 閱讀(173) | 評論 (0)編輯 收藏

Mediator模式
      該模型主要解決兩個或多個對象間的相互通信的問題。(個人認為該模式的思想同Observer模式的思想還是有點類似的。表面上看,他們所解決的問題類型根本不同,那為什么我會這么認為了?后面再說明)。按理說,各對象間的通信假如:ObjA與ObjB要進行通信。方法有好多種。比如:可以在它們內部各存一份對方的引用。在一方變動時,調用另一方進行同步即可。但確實如果系統(tǒng)大而復雜時,這將顯示的不那么清晰。因此,就希望中間會有個調停者。Mediator模式就因此而生。此時,ObjA與ObjB內部只存為一份Mediator(MediatorObj)對象的引用。在對象變動時,只需調用MediatorObj的相關接口,通知其他對象需要同步更新即可。因此,對ObjA或ObjB或其他的任何對象來說,它們有可能根本不知道還有其他的對象存在。(如:ObjA可能不知道ObjB的存在。)但通過MediatorObj對象,卻達到了ObjA與ObjB的同步作用。(現在想下,是不是與Observer模式有點類似?因為,如果在Observer模式的實現上,抽象出一個IObserverable來。那通過IObserverable對象,可以通知所有View的更新)。
 

class CClassA;
class CClassB;

class CMediator
{
public:
    CMediator(){}
    CMediator(CClassA
* pObjA, CClassB* pObjB)
    {
        
this->m_pObjA = pObjA;
        
this->m_pObjB = pObjB;
    }
    
void DoSyncFromAToB(void)
    {
        
this->m_pObjB->xxx
    }
    
void DoSyncFromBToA(void)
    {
        
this->m_pObjA->xxx
    }
private:
    CClassA
* m_pObjA;
    CClassB
* m_pObjB;
};

class CClassA
{
public:
    CClassA(){}
    CClassA(CMediator
* pMediator)
    {
        
this->m_pMediator = pMediator;
    }
    
void DoAction(void)
    {
        
// do some work here
        
        
// 通知其他對象,需要同步
        this->m_pMediator->DoSyncFromAToB();
    }

private:
    CMediator
* m_pMediator;
};

class CClassB
{
public:
    CClassB(){}
    CClassB(CMediator
* pMediator)
    {
        
this->m_pMediator = pMediator;
    }
    
void DoAction(void)
    {
        
// do some work here
        
        
// 通知其他對象,需要同步
        this->m_pMediator->DoSyncFromBToA();
    }

private:
    CMediator
* m_pMediator;
};
posted @ 2011-06-28 10:26 Jacc.Kim 閱讀(1026) | 評論 (0)編輯 收藏

Memento模式
      該模式的出現,主要是為了讓用戶擁有“撤銷”的操作。好給用戶有個恢復先前狀態(tài)的權力。其主要思想就是將對象(假設其類型為:ClassA)的先前狀態(tài)記錄起來(當然自己得管理好)。在需要時,用此恢復。根據此思路,當然實現方法就多種多樣。下面參考設計模式資料中的c++代碼。(覺得此代碼設計還是挺有道理的。因為對Memento類來說,除了ClassA的對象外,其他類型的對象都不需要,且也不應該能訪問到。因此,在具體實現上,它用了友元的技術)。
typedef std::string State;

class COperationsMemento
{
    
//其實更強的,可以將該類設計成??梢跃S護一組狀態(tài)的。這樣,就可以支持
    
//任意恢復到先前的第N種狀態(tài)。就好似photoshop的層的那樣的撤銷。
    
//為說明思想,此暫時只維護一個狀態(tài)。
private:
    State GetState(
void)
    {
        
return this->_sta;
    }
    
void SetState(const State& state)
    {
        
this->_sta = state;
    }
    
// some code here
private:
    State _sta;
};

class COperationSteps
{
public:
    friend 
class COperationsMemento;
    COperationSteps()
    {
        
this->m_pMemento = NULL;
        
this->_sta = "normal";
    }
    COperationSteps(COperationsMemento
* pMemento)
    {
        
this->m_pMemento = pMemento;
        
this->_sta = "normal";
    }
    
virtual ~COperationSteps()
    {
        
if (m_pMemento != NULL)
        {
            delete m_pMemento;
            m_pMemento 
= NULL;
        }
    }
    
//存儲狀態(tài)(即:保存狀態(tài))
    void SaveState(void)
    {
        
if (m_pMemento == NULL)
        {
            m_pMemento 
= new COperationsMemento();
        }
        m_pMemento
->SetState(this->_sta);
    }
    
//恢復狀態(tài)
    void RestoreState(COperationsMemento* pMemento = NULL)
    {
        
if (pMemento != NULL)
        {
            
this->_sta = pMemento->GetState();
        }
        
else
        {
            
this->_sta = m_pMemento->GetState();
        }
    }

private:
    COperationsMemento
* m_pMemento;    //需要維護,因為該狀態(tài),是自己私有的
    State _sta;
};

posted @ 2011-06-28 10:02 Jacc.Kim 閱讀(352) | 評論 (0)編輯 收藏

// FileOp.cpp : Defines the entry point for the console application.
//

#include 
"stdafx.h"

//要用ifstream與ofstream進行文件的輸入與輸出操作,必須包含此頭文件
#include <fstream>
#include 
<iostream>
#include 
<stdio.h>//FILE需要



int _tmain(int argc, _TCHAR* argv[])
{
    
//技術扶自: http://www.mini188.com/showtopic-954.aspx

/************************************************************************/
/** 輸入文件流 ofstream
/***********************************************************************
*/
    
/*
    //聲明文件輸入的操作對象(輸出流對象)
    std::ofstream fout;
    //打開一個文件,提示:如果Output.txt文件不存在,則系統(tǒng)會自動為你創(chuàng)建一個
    fout.open("Output.txt");
    //對文件進行寫操作。
    fout << "This is a first line." << "\n";
    fout << "This is a second line." << "\n";
    
    int num = 150;
    char name[] = "John Doe";
    fout << "Here is a number: " << num << "\n";
    fout << "Now here is a string: " << name << "\n";

    //將文件流內容保存到硬盤
    fout.flush();
    //關閉文件流
    fout.close();
    
*/


/************************************************************************/
/** 輸入文件流 ifstream  12 GameDev 15.45 L This is really awesome!
/***********************************************************************
*/
    
/*
    std::ifstream fin("Input.txt");
    
    int number;
    float real;
    char letter, word[8];
    fin >> number >> word >> real >> letter;
    char sentence[1000];
    fin.getline(sentence, 1000);

    fin.close();
    
*/


/************************************************************************/
/** 文件流操作 fstream
/***********************************************************************
*/
//     std::fstream fFile;
//     fFile.open("Output.txt", std::ios::in | std::ios::out);
    
//fFile.open("無線iPhone平臺開發(fā)基礎培訓交流圈.jpg");    //經測試,非文本文件資源是打不開的。
    
    
//將整個文件的內容讀取出來,并顯示
    
//注意:用這種方法讀出來的,都是忽略空格與換行符的
//     if (fFile.is_open())
//     {
//         char letter;
//         //while (fFile.good() && !fFile.eof())
//         while (!fFile.eof())    //用這個與上面那個都是一樣的效果
//         {
//             fFile >> letter;
//             if (fFile.eof())
//                 break;
//             std::cout << letter << std::endl;
//         }
//         getchar();
//     }


    
//注意:用這種方法讀限出來的,都是沒忽略末尾的換行符的
//     if (fFile.is_open())
//     {
//         char line[2048];    
//         while (fFile.good() && !fFile.eof())
//         {
//             fFile.getline(line, 2048);
//             static int count = 0;
//             if (count < 3)
//             {
//                 count += 1;
//                 fFile.seekg(0, std::ios::beg);    //這個是改變讀的指針位置。如果是想改變寫的指針位置用fFile.seekp(0, std::ios::beg/end);
//             }
//             std::cout << line << std::endl;
//         }
// 
//         //將第一行的字符串改:"The first line string is changed."
//         fFile.seekp(0, std::ios::beg);
//         //fFile << "The first line string is changed.";    //寫內容不是這樣寫的。如果是ofstream可以這么寫。但對于fstream需要用下面的方法來寫。測試結果發(fā)現,仍是寫不進去
//         //char* pszTempForWrite = "The first line string is changed.";
//         //fFile.write(pszTempForWrite, strlen(pszTempForWrite));
//         fFile.seekg(0, std::ios::beg);
//         fFile.getline(line, 2048);
//         std::cout << line << std::endl;
//         getchar();
//     }

//     //* fstream的其他一些方法
//     //read方法
//     char* pszOutputFileText = NULL;
//     fFile.seekg(0, std::ios::end);
//     int nSize;
//     nSize = fFile.tellg();
//     //std::cout << fFile.tellg() << std::endl;
//     //用read方法一次性將整文件給讀取出來(注意:這些讀出來后,末性居然會帶了一個亂碼。這個郁悶。)
//     pszOutputFileText = new char[nSize + 1];
//     fFile.seekg(0, std::ios::beg);
//     fFile.read(pszOutputFileText, nSize);
//     pszOutputFileText[nSize] = '\0';
//     std::cout << pszOutputFileText << std::endl;
//     delete [] pszOutputFileText;
//     getchar();
// 
//     fFile.close();


/************************************************************************/
/** 二進制文件的讀寫
/***********************************************************************
*/


/************************************************************************/
/** 字符串長度
/***********************************************************************
*/
//     char* pszString = "Hello";
//     std::cout << strlen(pszString) << std::endl;    //輸出5
// 
//     std::string sString = "Hello";
//     std::cout << strlen(sString.c_str()) << std::endl;//輸出5
// 
//     char szTest[5] = { 'H', 'e', 'l', 'l', 'o' };
//     std::cout << szTest[5] << std::endl;    //越界了,所以會報。
//     getchar();


/************************************************************************/
/** 使用FILE類對文件進行操作 (FILE在stdio.h中
/***********************************************************************
*/
    FILE
* materialFile = fopen("DefaultObjectStd.material""r");
    
if (materialFile == NULL)
    {
        std::cout 
<< "Open the file \"DefaultObjectStd.material\" failure." << std::endl;
        
return 0;
    }

    
const int MAX_COUNT =2048;
    
char everyline[MAX_COUNT] = { '\0' };
    
while (fgets(everyline, MAX_COUNT, materialFile))
    {
        std::cout 
<< everyline;    //注意:通過fgets()函數讀取出來的定符串,末尾是帶有換行符的。這與上面的是不一樣的。
    }

    
//取得文件的長度(即:文件的大小)
    int nMaterialFileSize;
    fseek(materialFile, 
0, SEEK_END);
    nMaterialFileSize 
= ftell(materialFile);
    std::cout 
<< std::endl << nMaterialFileSize << std::endl;
    
    getchar();

    fclose(materialFile);
    

    
return 0;
}
posted @ 2011-06-27 18:21 Jacc.Kim 閱讀(827) | 評論 (0)編輯 收藏

說明:
      本文來自CSDN博客:http://blog.csdn.net/goodluckyxl/archive/2005/01/19/259851.aspx




強制轉化四種類型可能很多人都常常忽略就象我一樣,但是有時還是比較有用的。不了解的建議看看,一些機制我也不是十分了解,只是將一些用法寫出來讓大家看看。

強制轉化無論從語法還是語意上看,都是c++中最難看的特征之一。但是基于c風格的轉化的語義的不明確性及其一些潛在問題。強制類型轉化最終還是被c++接受了。
1.static_cast運算符號
static_cast<T>(e),stroustrup讓我們可以把它看成隱含轉換的顯示的逆運算。這個是有一定道理的,基于隱式轉化的對象類型我們可以使用static_cast轉化運算符號。它是靜態(tài)的檢測,無法運行時檢測類型,在繼承中尤為突出。
使用范圍
<1>用于所有系統(tǒng)類型之間轉化,不能用于系統(tǒng)類型指針類型轉化
  double t_d = 0;
int t_i= static_cast<int>(t_d); //是合法的轉化
而企圖將double*->int*是不允許的
<2>用于繼承類之間的轉化(含指針),不能用于其他沒有隱式轉化的對象類型之間的轉化
繼承舉例:
class x
{
};
class y: public x
{
};
使用:x t_o_x;
y t_o_y = static_cast<y>(t_o_x); //x* y*轉化也可以進行因為x,y繼承關
//系,類型可以自動隱式轉化使用
   隱式轉化舉例:
class x
{
};
class y
{

public:
    y( x i_x ) {}
};
    x t_o_x;
     y t_o_y = static_cast<y>(t_o_x); //大家看到y(tǒng)構造函數可以對于x類型隱式轉化
//所以可以將x->y,如果企圖將y->x會報錯
2.reinterpret_cast 運算
主要用于對于類型指針類型的強制轉化,some_type* -> special_type*這樣轉化,類型信息可以是不完全的。它允許將任意指針轉化到其他類型指針,也允許任意整數類型到任意指針類型轉化(BT)。這樣導致的結果是極其不安全的,不能安全的應用于其他目的,除非轉化到原來類型。
<1> 使用所有整形可以轉化為任意類型的指針(指針是4字節(jié)的long的東東,那么機器就認為同類型就是可以轉化)
int c;
x* p = reinterpret_cast<x*>(c); //x是自定義的任意類型,當然包括系統(tǒng)類型
<2> 可以對于任意類型指針之間轉化
y* c;
x* p = reinterpret_cast<x*>(c);//x,y代表所有自定義或系統(tǒng)類型
大家可以看到reinterpret_cast的轉化是極度的不負責任的,他只管轉化不檢測是否可以轉化。
<3> const_cast運算符號
這個很簡單從名字大家可以看出來,僅僅為了去掉或著加上const修飾符號。但是對于本身定義時為const的類型,即使你去掉const性,在你操作這片內容時候也要小心,只能r不能w操作,否則還是會出錯。
const char* p = "123";
char* c = const_cast<char*>(p);
c[0] = 1;  //表面上通過編譯去掉了const性,但是操作其地址時系統(tǒng)依然不允許這
//么做。這是一個漏洞吧
<4> dynamic_cast運算符號
Scott Mayers將其描述為用來執(zhí)行繼承體系中:安全的向下轉型或者跨系轉型動作。也就是說你可以,用dynamic_cast將 指向base class的指針或引用轉型為 指向子類的對象的指針或引用。
class B {};  //polymorphic類型含virtual才能dynamic_cast
class D: public B {}
void f( B* pb )
{
    D* pd1 = dynamic_cast<D*>(pb);//如果pb為d類型正確返回,如果不是返回0
    D* pd2 = static_cast<D*>(pb); //不管怎么樣都返回指針有可能指向不合適的對
//象,因為static僅僅靜態(tài)檢測,不能得到運
//行時對象的信息是否真正為D類型
}

反正大家在使用知道怎么用就ok了,c++強制轉化在模板中還是非常有用的,其他時候本人也喜歡用c的轉化方便。^_^

posted @ 2011-06-24 12:30 Jacc.Kim 閱讀(314) | 評論 (0)編輯 收藏

聲明:
 1 /************************************************************************/
 2 /** 系統(tǒng)全局函數
 3 /************************************************************************/
 4 
 5 #pragma once
 6 
 7 #include <string>
 8 
 9 // 取得應用程序路徑(末尾帶 '\' 的)
10 CString ExtractFilePath(void);
11 // 取得應用程序路徑(末尾不帶 '\' 的)
12 CString ExtractFileDir(void);
13 // 取得指定文件的目錄(參數為文件的完整路徑,返回值末尾不帶 '\' 的)
14 CString GetFileDir(const CString& csFullFileName);
15 // 取得指定文件的目錄(參數為文件的完整路徑,返回值末尾帶 '\' 的)
16 CString GetFilePath(const CString& csFullFileName);
17 // 將CString轉換成string(將Unicode串轉換成Ansi(返回string))
18 std::string ConvertW2A(const CString& csString);
19 // 將路徑中的指定字符用另外的指定字符替換,并返回(string)
20 std::string StringReplace(const char* pszString, const char cSourceChar, const char cDestChar);

實現:
 1 #include "stdafx.h"
 2 #include "GlobalFunction.h"
 3 #include <atlconv.h>
 4 
 5 CString ExtractFileDir(void)
 6 {
 7     CString csResult;
 8     WCHAR pszExeFullPath[MAX_PATH];
 9     ::GetModuleFileName(NULL, pszExeFullPath, MAX_PATH);
10     csResult = pszExeFullPath;
11     int iPos = csResult.ReverseFind('\\');
12     csResult = csResult.Left(iPos);
13     return csResult;
14 }
15 
16 CString ExtractFilePath(void)
17 {
18     CString csResult = ExtractFileDir();
19     if (csResult.GetLength() > 0)
20         return csResult + L"\\";
21     return csResult;
22 }
23 
24 CString GetFileDir(const CString& csFullFileName)
25 {
26     if (!::PathFileExists(csFullFileName))
27         return CString(L"");
28 
29     CString csResult(csFullFileName);
30     int iPos = csResult.ReverseFind('\\');
31     csResult = csResult.Left(iPos);
32     return csResult;
33 }
34 
35 CString GetFilePath(const CString& csFullFileName)
36 {
37     CString csResult = GetFileDir(csFullFileName);
38     if (csResult.GetLength() > 0)
39         csResult + "\\";
40     return csResult;
41 }
42 
43 std::string ConvertW2A(const CString& csString)
44 {
45     USES_CONVERSION;
46     return std::string(W2A(csString));
47 }
48 
49 std::string StringReplace(const char* pszString, const char cSourceChar, const char cDestChar)
50 {
51     if (strlen(pszString) == 0)
52         return std::string("");
53     const UINT iLen = strlen(pszString) + 1;
54     char* pszTargetString = new char[iLen];
55     //char pszTargetString[iLen];
56     try
57     {
58         strncpy(pszTargetString, pszString, iLen);
59         for (int iIndex = 0; iIndex != iLen; iIndex++)
60         {
61             if (pszTargetString[iIndex] == cSourceChar)
62                 pszTargetString[iIndex] = cDestChar;
63         }
64         delete [] pszTargetString;
65         return std::string(pszTargetString);
66     }
67     catch ()
68     {
69         delete [] pszTargetString;
70         return std::string("");
71     }
72 }
posted @ 2011-06-15 15:35 Jacc.Kim 閱讀(599) | 評論 (0)編輯 收藏

      Strategy模式(即:策略模式)。其所要所要解決的問題,同Template模式是同一類問題。但具體的處理方式有所不同。Template則是使用:封裝繼承與多態(tài)的方式實現(主要是:繼承與多態(tài))。而策略模式,則主要使用繼承連同“組合”的方式來實現邏輯接口的提供。因此,如果Template模式中的邏輯接口要是有許多的話,則邏輯抽象基類,將變得十分龐大而復雜。同時,不同實現類的接口將全部暴露無疑。而組合則重在將某一邏輯接口的實現通過多個對象的組合方式實現之。下面看下策略模式的結構:
 1class Strategy
 2{
 3public:
 4  //
 5  virtual void Func1(void= 0;
 6  virtual void Func2(void= 0;//這兩個接口只是示例
 7  // some other interfaces here
 8}
;
 9
10class Sub1 : Strategy
11{
12public:
13  void Func1(void)
14  {
15    // do something
16  }

17  void Func2(void)
18  {
19    // do something
20  }

21}
;
22
23class Sub2 : Strategy
24{
25public:
26  void Func1(void)
27  {
28    // do something
29  }

30  void Func2(void)
31  {
32    // do something
33  }

34}
;
35
36class Strategy;
37//策略類結構
38class Context
39{
40public:
41  Context(const Strategy* pStrategyObj) : m_pStrategyObj(pStrategyObj) {}
42  // 
43  // 邏輯接口DoAction
44  void DoAction(void)
45  {
46    if (NULL != m_pStragegyObj)
47    {
48      m_pStrategyObj->Func1();
49      m_pStrategyObj->Func2();
50      // 
51    }

52  }

53}
;

 

    注意:設計模式中,更提倡優(yōu)先使用組合,而非繼承。詳細原因,也可以從以上模式比較得出。

posted @ 2011-06-12 12:13 Jacc.Kim 閱讀(322) | 評論 (0)編輯 收藏

      Template模型,其實很容易理解,相信大家平時也經常在用。其主要思想就同處理這么一類問題:有A對象,與B對象(或更多),它們的處理不同,但他們的邏輯卻是相同的。因此,我們在處理這類問題時,很自然的就會想到。給它們的邏輯處理用一抽象類封裝起來。用兩個具體的(實現)派生類繼承之。這就是Template模型的原理。
      下面是程序示例:
 1class LogicalAbstractClass
 2{
 3public:
 4     // some code here
 5    // 邏輯接口1
 6    virtual void Logical1(= 0;
 7    // 邏輯接口2
 8    virtual bool Logical2(= 0;
 9     // some other logical interfaces
10}
;
11
12class SubClassA : public LogicalAbstractClass
13{
14public:
15    void Logical1() }
16    bool Logical2() return true/false; }
17}
;
18
19class SubClassB : public LogicalAbstractClass
20{
21public:
22    void Logical1() }
23    bool Logical2() return true/false; }
24}
;
25
26int main(int argc, char* argc[])
27{
28    LogicalAbstractClass* pA = NULL;
29    LogicalAbstractClass* pB = NULL;
30    pA = new SubClassA;
31    pB = new SubClassB;
32    
33    delete pB;
34    delete pA;
35}

      補充:Delphi的code示例就不給了。一個道理。懂得思想,所有語言通用。
posted @ 2011-06-12 11:51 Jacc.Kim 閱讀(280) | 評論 (0)編輯 收藏

 該模式也相對簡單。其主要處理的是這類問題:當系統(tǒng)或某些模塊已經成形后,突然需要增加某些功能。而這些功能的增加
在現有的對象中,暫時沒有辦法處理。同時,卻發(fā)現,該功能,其實另一模塊的對象卻可以處理的了。因此,就希望能夠在不修改原
有操作及系統(tǒng)結構的情況下,就自然而然地將該功能實現出來。此時,就可以使用Adapter來處理之。(注:在此,我們強調的是不
去修改原有系統(tǒng)的結構的情況下)。
 就上述問題,Adapter模式有兩種解決方法。一種是通過對象適配來解決。另一種是通過類適配來解決。所謂的對象適配,指
的是,通過引入具有我們需要功能接口的對象(設類為X),在實現處理過程中,我們使用的是X的功能接口,以此來達到我們的需求。
而類適配,則指的是,產生一個新類,讓該新類,繼承自X類,則自然,該新類就會有了X的相關接口。下面看下,這兩種適配的代碼。

對象適配
class X
{
public:
 ...
 virtual func(...);
};

class ObjAdapterObject : public ...
{
public:
 void func(...)
 {
  if (m_pXObj != NULL)
   m_pXObj->func(...);
 }
private:
 X* m_pXObj;
};

類適配
class X的聲明及定義同上。

class ClassAdapterObject: public X, public  ...
{
public:
 ...
};

以下調用就不寫了,你懂得的。

posted @ 2011-05-21 23:54 Jacc.Kim 閱讀(368) | 評論 (0)編輯 收藏

僅列出標題
共14頁: First 6 7 8 9 10 11 12 13 14 
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            亚洲午夜高清视频| 国产一区二区三区直播精品电影 | 国产精品久久久久影院色老大| 麻豆av一区二区三区| 久久久99爱| 欧美成人精品h版在线观看| 欧美大片在线观看| 欧美激情区在线播放| 欧美日韩中文字幕在线视频| 国产精品乱码| 激情久久久久久久| 91久久夜色精品国产九色| 亚洲美女毛片| 欧美一区二区三区免费大片| 久久综合亚州| 日韩图片一区| 欧美在线精品一区| 欧美日韩91| 韩国精品主播一区二区在线观看| 91久久精品久久国产性色也91| 一区二区三区四区蜜桃| 久久成人这里只有精品| 亚洲激情一区| 最新国产拍偷乱拍精品 | 日韩视频一区二区| 欧美在线观看一二区| 欧美日韩精品久久| 黄色成人片子| 亚洲视频免费| 欧美大片在线观看| 亚洲与欧洲av电影| 午夜一区二区三视频在线观看 | 欧美在现视频| 亚洲人体偷拍| 久久久久久免费| 国产精品一区二区女厕厕| 亚洲精品国产精品国自产观看浪潮 | 亚洲一区在线免费| 欧美高清在线精品一区| 国产一区二区三区四区在线观看| av成人激情| 欧美国产精品中文字幕| 亚洲欧美中文另类| 国产精品草莓在线免费观看| 亚洲精品永久免费精品| 欧美**字幕| 久久久精品tv| 好吊视频一区二区三区四区| 小处雏高清一区二区三区| 日韩视频免费观看高清在线视频 | 国产欧美精品| 亚洲欧美成人一区二区在线电影| 亚洲国产精品高清久久久| 久久九九免费视频| 国语自产偷拍精品视频偷| 久久精品国产一区二区三区免费看 | 亚洲欧美国产毛片在线| 久久久久网站| 亚洲另类在线视频| 久久久久国产成人精品亚洲午夜| 国产精品麻豆成人av电影艾秋| 99综合精品| 日韩视频在线你懂得| 欧美日韩国产成人在线免费| 亚洲全部视频| 亚洲国产人成综合网站| 欧美暴力喷水在线| 夜夜嗨av色综合久久久综合网| 亚洲人在线视频| 欧美日韩三级在线| 亚洲在线不卡| 午夜视频一区二区| 国产婷婷色一区二区三区四区| 久久av一区二区| 久久亚洲捆绑美女| 亚洲免费不卡| 亚洲图片激情小说| 国语自产精品视频在线看| 欧美国产日韩一区二区在线观看| 欧美高潮视频| 午夜精品在线| 久久精品日产第一区二区三区| 91久久中文| 在线午夜精品自拍| 国产综合久久| 亚洲精品1234| 国产日韩欧美电影在线观看| 乱中年女人伦av一区二区| 欧美黑人国产人伦爽爽爽| 亚洲欧洲av一区二区| 久久精品人人做人人爽| 夜夜夜久久久| 久久久av毛片精品| 中文欧美日韩| 久久国产免费| 亚洲在线视频网站| 开元免费观看欧美电视剧网站| 中国成人亚色综合网站| 欧美伊人久久大香线蕉综合69| 亚洲人成免费| 欧美中文在线视频| 中文在线不卡| 久久综合色影院| 午夜精品亚洲一区二区三区嫩草| 另类春色校园亚洲| 欧美一区久久| 欧美日韩精品一区| 欧美韩日一区二区三区| 国产伦精品一区二区| 亚洲精品国产视频| 亚洲成在线观看| 亚洲夜间福利| 一区二区三区欧美成人| 久久综合狠狠综合久久激情| 午夜精品久久久久久久99水蜜桃| 免费美女久久99| 狼人天天伊人久久| 国产一区二区日韩精品欧美精品| aa级大片欧美| 99精品视频免费| 免费亚洲电影| 牛牛精品成人免费视频| 国产综合av| 性高湖久久久久久久久| 亚洲一线二线三线久久久| 欧美日韩国产麻豆| 亚洲精品欧洲精品| 亚洲欧洲日本专区| 欧美成人午夜剧场免费观看| 美女图片一区二区| 一区二区亚洲欧洲国产日韩| 午夜在线视频一区二区区别| 性欧美大战久久久久久久免费观看| 欧美日韩网站| 一个色综合导航| 亚洲欧美另类综合偷拍| 国产精品v日韩精品v欧美精品网站| 亚洲精品系列| 亚洲一区二区影院| 国产精品久久久久久超碰| 亚洲视频精品| 欧美在线地址| 精品电影在线观看| 六月婷婷久久| 亚洲麻豆av| 亚洲视频一区二区免费在线观看| 欧美日韩国产欧| 一区二区三区视频观看| 欧美在线观看日本一区| 国外成人网址| 欧美精品v日韩精品v国产精品| 亚洲精品网站在线播放gif| 亚洲综合色自拍一区| 国产日韩一级二级三级| 久久综合色播五月| 一本色道久久| 欧美在线亚洲在线| 亚洲电影在线| 欧美日韩一区二区国产| 午夜激情综合网| 欧美成人xxx| 亚洲自啪免费| 在线电影欧美日韩一区二区私密| 欧美激情第六页| 亚洲综合精品自拍| 欧美激情国产高清| 欧美亚洲日本网站| 亚洲日本欧美日韩高观看| 国产精品无人区| 免费永久网站黄欧美| 亚洲欧美电影院| 亚洲国产日韩在线| 欧美一二三视频| 亚洲国产午夜| 国产视频精品xxxx| 欧美日本中文字幕| 久久精品一二三| aa成人免费视频| 欧美福利精品| 亚洲欧美一区二区三区极速播放 | 国产一区二区三区最好精华液| 女人色偷偷aa久久天堂| 亚洲性夜色噜噜噜7777| 欧美激情中文字幕乱码免费| 午夜伦理片一区| 亚洲伦理精品| 精品二区久久| 国产欧美精品一区| 欧美日韩一区二区三区高清| 久久嫩草精品久久久久| 亚洲欧美综合国产精品一区| 亚洲精品午夜精品| 亚洲二区精品| 美国成人直播| 久久久xxx| 性视频1819p久久| 亚洲女同同性videoxma| 正在播放亚洲| 亚洲精品日韩在线| 亚洲黄色天堂|