【數據結構實戰C++】13 類族結構改進
作者 CodeAllen ,轉載請註明出處
遵循經典設計準則
設計的KKlib中的所有類位於單一的繼承樹
如何通過編程改進
改進的關鍵點
-exception類繼承自object類
- 堆空間中創建異常對象失敗的時候,返回NULL指針
-新增InvalidOperationException異常類 - 成員函數調用時,如果狀態不正確則拋出異常
-SmartPointer類繼承自object類 - 堆空間中創建智能指針對象失敗時,返回NULL指針
實驗1 類族結構的進化
將之前的SmartPointer.h改爲繼承自父類object
#include <iostream>
#include <Exception.h>
#include "Object.h"
#include "SmartPointer.h"
using namespace std;
using namespace KKLib;
int main()
{
SmartPointer<int>* sp = new SmartPointer<int>(); //是一個模板,需要把指向的指針寫出來
delete sp;
return 0;
}
#include <iostream>
#include <Exception.h>
#include "Object.h"
#include "SmartPointer.h"
using namespace std;
using namespace KKLib;
int main()
{
InvalidOperationException* e = new InvalidOperationException();
delete e;
return 0;
}
從結果看,所有類都繼承自父類 object
KKLib的開發方式和注意事項
-迭代開發
- 每次開發完一個小目標,持續開發,最終打造可複用類庫
-單一繼承樹 - 所有類都繼承自object,規模堆對象創建時的行爲
-只拋異常,不處理異常 - 使用THROW_EXCEPTION拋出異常,提高可移植性
-弱耦合性 - 儘量不適用標準庫中的類和函數,提高可移植性
實驗 : 可移植性測試(很多公司要求不能使用異常處理機制,不能用try … catch …)
#define THROW_EXCEPTION(e, m) //(throw e(m, FILE, LINE))
int main()
{
cout << "main begin" <<endl;
THROW_EXCEPTION(InvalidOperationException, "test");
cout << "main() end" << endl;
return 0;
}
改動之後會順利執行,但是這行沒有意義