1、編寫函數,實現把一個char組成的字串迴圈右移n位。如abcdehi,n=2,則hiabcde。範例程式碼#include "iostream"using namespace std;const int MAX_LEN = 20;void LoopMove(char* cpStr, int iSteps){//注意,在整個處理過程中,cpStr的最後字元都沒有涉及處理char cTempArray[MAX_LEN];size_t szStrLength =
1、意圖使多個對象都有機會處理請求,從而避免請求的寄件者和接收者之間的耦合關係,將這些對象連成一條鏈,並沿著這條鏈傳遞該請求,直到有一個對象處理它為止。2、核心思想在責任鏈模式中,很多個物件由每一個對象對其下家的引用而接起來形成一條鏈。請求在這個鏈上傳遞,直到鏈上的某一個對象決定處理此請求。客戶並不知道鏈上具體的哪一個對象最終處理了這個請求,系統可以在不影響用戶端的情況下,動態重新組織鏈和分配責任。處理者有兩個選擇:承擔責任或者把責任推給下家。一個請求可以最終不被任何接收端對象所接受。3、優缺點
1、通過設計模式,找到封裝變化,對象間鬆散耦合,針對介面編程的感覺,設計易維護、易擴充、易複用、靈活性好的程式。2、通過封裝,繼承,多態把程式的耦合度降低。把商務邏輯與介面邏輯分開,讓它們之間的耦合度下降,使他們更容易維護和擴充。3、範例程式碼#include "iostream"#include "string"#include "vector"//#include "functional"//#include "algorithm"using namespace std;class
1、意圖中介者模式:用一個中介對象來封裝一系列的對象互動。中介者使各對象不需要顯式地相互引用,從而使其耦合鬆散,而且可以獨立地改變它們之間的互動2、核心思想封裝了一系列對象相互作用的方式,使得這些對象不必相互明顯作用。從而使他們可以鬆散耦合。當某些對象之間的作用發生改變時,不會立即影響其他的一些對象之間的作用。保證這些作用可以彼此獨立的變化。調停者模式將多對多的相互作用轉化為一對多的相互作用。調停者模式將對象的行為和協作抽象化,把對象在小尺度的行為上與其他對象的相互作用分開處理。3、優缺點分析中
1、Application
1、型錄網就是CRuntimeClass組成的一個鏈表。應用程式使用DECLARE_SERIAL,IMPLEMENT_SERIAL兩個宏,就獲得檔案讀寫以及動態建立兩種機制。2、Serializable的必要條件 欲讓一個對象有Serialize能力,它必須派生自一個Serializable類,一個類意欲成為Serializable,必須有下列五大條件: 1)從CObject派生下來,如此以來可保有RTTI、Dynamic Creation等機能。
書中講這了RTTI,Dynamic Creation,Persistance,Message Mapping,Message Routing等的實現。[1]尤其是其中的類型錄網的建立過程值得學習。1、MFC對於訊息迴圈的規定:(1) 如果是普通的Windows訊息,則一定由衍生類別流向基類,不會有迂迴。(2)
1、同一份Document的多個views,在Document的一個view改變了後,如何同步其它view呢? 讓所有的Views 同步更新資料的關鍵在於兩個函數: 1)CDocument::UpdateAllViews:這個函數會巡訪所有隸屬同一份Document的各個Views,找到一個就通知一個,而所謂「通知」就是調用其OnUpdate
ATL(ActiveX Template Library),關於ActiveX控制項的開發設計,可參考ActiveX Control Inside Out。LIB <DIR> MFC的靜態函數庫1、開發流程圖示 Resource Editor 做出的各種資源與程式碼間通過ClassWizard來搭橋串連。ClassWizard主要工作是:改寫代碼實現自己的要求(加成員變數或改寫虛函數);搭訊息與程式碼間的橋(建立Message Map)。參考[1] 深入淺出MFC[2]
1、主要還是視窗的拆分。[1,P543]2、ASCII->HExn = forIt[i] & 0x00FF;3、要具有預覽列印功能(View),需要改寫三個函數:virtual BOOL OnPreparePrinting(CPrintInfo* pInfo);virtual void OnBeginPrinting(CDC* pDC, CPrintInfo* pInfo);virtual void OnEndPrinting(CDC* pDC, CPrintInfo*
Message Mapping and Command Routing1、MFC把訊息三大類:1)命令訊息(WM_COMMAND):凡由UI 對象產生的訊息都是這種命令訊息,可能來自菜單或加速鍵或工具列。SDK程式主要靠訊息的wParam 辨識之,MFC程式則主要靠功能表項目的識別碼(menu ID)辨識之,兩者其實是相同的。 凡衍生自CCmdTarget 的類別,皆有資格接收改類型訊息。幾乎構造應用程式的最重要的幾個類別都衍生自CCmdTarget。2)標準訊息:除WM_COMMAND
1、問題描述:給定n個數,求相鄰的k個數之和為最大。要求給出複雜度較小的一種演算法再解決這個問題前,先瞭解一下類似的常見問題。2、給定一串數字(可正可負的int,放在數組Num裡),要求找到起始位置start和終止位置end,使得從start位置到end位置的所有數字之和最大,返回這個最大值max。演算法思想:用動態規划算法實現。設 iMaxSum 為以 iNumPar[i] 終止且包含 iNumPar[i] 的最大序列的和,有: iMaxSum = iNumPar[0];
關於對話方塊的討論,[2,3]中校為豐富。 DDX,是把對話方塊類別中的成員變數與對話方塊中的控制組件產生關聯,於是當對話方塊結束時,控制組件的內容會自動傳輸到這些成員變數上。DDV,是允許我們設定對話方塊控制組件的內容類型以及資料(數值)範圍。參考[1] 深入淺出MFC[2] http://blog.163.com/zhoumhan_0351/blog/static/39954227201041902622877/[3] http://blog.163.com/zhoumhan_
一個類的執行個體化對象所佔空間的大小? 注意不要說類的大小,是類的對象的大小。首先,類的大小是什嗎?確切的說,類只是一個類型定義,它是沒有大小可言的。 用sizeof運算子對一個類型名操作,得到的是具有該類型實體(對象)的大小。 如果 Class A; A obj;
1、意圖命令模式:將一個請求封裝為一個對象,從而使你可用不同的請求對客戶進行參數化;對請求排隊或記錄請求日誌,以及支援可撤銷的操作2、核心思想命令模式:把一個請求或者操作封裝到一個對象中,命令模式把發出命令的責任和執行命令的責任分割開來,委派給不同的對象。命令模式允許請求的一方和發送的一方獨立開來,使得請求的一方不必知道接收請求的一方的介面,更不必知道請求是怎麼被接收,以及操作是否執行,何時被執行以及是怎麼被執行的。3、優缺點分析GOOD: 一、能較容易地建立一個命令隊列; 二、在需要的情況下,
1、轉換字串的輸入格式為:原來字串裡的字元+該字元連續出現的個數,例如字串:1233422222,轉化為1121324125。 我們用sprintf來實現,類同printf。#include "iostream"#include "string"using namespace std;int main() {cout << "Enter the numbers: " << endl;string str;cin >> str;size_t
1、意圖享元模式:運用共用技術有效地支援大量細粒度的對象2、核心思想 享元模式以共用的方式高效的支援大量的細粒度對象。享元模式能做到共用的關鍵是區分內蘊狀態和外蘊狀態。 內蘊狀態儲存在享元內部,不會隨環境的改變而有所不同。外蘊狀態是隨環境的改變而改變的。外蘊狀態不能影響內蘊狀態,它們是相互獨立的。 將可以共用的狀態和不可以共用的狀態從常規類中區分開來,將不可以共用的狀態從類裡剔除出去。
1、當涉及到“維護”時,為了“複用”目的而使用繼承,並不是最好的方法。 2、利用繼承來提供對象的行為,會導致以下缺點: 1)代碼在多個子類中重複; 2)運行時的行為不容易改變; 3)很難知道所有子類的全部行為; 4)改變父類會牽一髮而動全身,造成其他子類不想要的改變; 3、使用介面(JAVA)或虛基類加多重繼承(C++)方法,則會需要對需要維護的代碼中的每個子類都分別考慮其特有方法的繼承來源。
1、意圖裝飾模式:動態給一個對象添加一些額外的職責(不重要的功能,只是偶然一次要執行)。就增加功能來說,Decorator模式比使用繼承產生子類更為靈活。 建造過程不穩定,需要把所需的功能按正確的順序串聯起來進行控制。2、優缺點分析GOOD:當你向舊的類中添加新代碼時,一般是為了添加核心職責或主要行為。而當需要加入的僅僅是一些特定情況下才會執行的特定的功能時(簡單點就是不是核心應用的功能),就會增加類的複雜度。
1、如下樣本程式中:範例程式碼// Win32_test.cpp : 定義控制台應用程式的進入點。#include "stdafx.h"#include "iostream"using namespace std;int _tmain(int argc, _TCHAR* argv[]){char *a = "hello";char *b = "hello";char s[] = "hello";//*b = 'b'; errors[0] =