Design Pattern
With C++
設計模式
如何設計堆砌程式碼的方法
0
5
0
0
0
5
5
0
5
5
Class
Class
- 物件導向設計的基本單位
- 類別內的變數稱為成員變數
- 類別的函數稱為成員函數
class Dog
{
string m_color;
public:
string furColor();
};
Class
- 變數:紀錄自身的狀態
- 函數:外界的操作方法
其他東西
Class 內部
成員屬性
- 高階物件導向語言通常可設定成員的屬性,避免重要資料或被外界使用
其他東西
Class 內部
Private
Public
Dog Class
class Dog
{
int m_age;
int m_variety;
int calcFriendly();
public:
string bark();
int friendly();
};
Class的生死學
- 建構子與解構子
建構子與解構子
- 在物件被建立與銷毀時會呼叫的函數
- 建構子的功能
- 初始化預設資料
- 限制物件的操作行為
- 解構子
- 使物件正確釋放資源
建構子 constructor
- 在C++中與class同名的成員函數
class Dog
{
int m_age;
int m_variety;
int calcFriendly();
public:
string bark();
int friendly();
Dog(int age, int variety)
{
m_age = age;
m_variety = variety;
}
};
解構子 ~destructor
- 在C++中與class同名的成員函數
class Dog
{
int m_age;
int m_variety;
int calcFriendly();
public:
string bark();
int friendly();
Dog(int age, int variety)
{
m_age = age;
m_variety = variety;
}
};
成員屬性
- Private:限制只有自己可以使用
- Public:大家都可以用
- Protected:限制只有自己/繼承者可以使用
Class預設成員皆是Private
範例 A
- 請製作一個動態配置的矩陣 Matrix
class Matrix
{
int *data;
int row;
int column;
public:
Matrix(int r, int c);
~Matrix();
int& at(int x,int y);
};
noncopyable
- Boost core @
物件導向
物件導向 vs 程序導向
程序導向:透過數值來達成條件判斷
物件導向:透過型態來達成條件判斷
Solo Queue
Team Work
封裝
- 將實作的方法隱藏起來,讓其他人只要會用就好,不用管裡面有什麼
垃圾 - 如何設計要讓其他人用什麼東西 ?
C++ vector
Windows API
繼承
- 重複利用舊的Code,避免重寫太多一樣的東西
- 繼承的類別間有某種共存的能力
C++ basic_ios
C++ ostream
C++ fstream
#include<bits/stdc++.h>
using namespace std;
void SayHello(ostream &out)
{
out<<"hello!"<<endl;
}
int main()
{
stringstream ss;
ofstream fout("a.txt");
SayHello( cout );
SayHello(ss);
SayHello( fout );
cout<<"ss:"<<ss.str();
cout<<"fout:";
system("type a.txt");
}
繼承的妙用
父類別可以通吃所有子類別
多型
- 繼承的子類別可以一定程度改寫父類別的實作
- 前頁範例就是一個例子
使用C++實作
- 封裝 (這不用再重複吧?)
- 繼承
- 多形
C++的物件導向複雜程度大致上也是最龐雜的
C++的繼承
C++的繼承
- 單一類別繼承
- 多重類別繼承
- 虛擬繼承
- @
單一類別繼承
- 把別的的class變成自己的一部份
- 有些東西無法繼承
- 建構子、解構子
- operator =
- friends
- private 成員 (無法存取)
class 子類別 : 屬性:父類別 {
};
單一類別繼承
class Base {
public:
void say()
{
cout<<"Base, Hi!"<<endl;
}
};
class Child: public Base {
public:
void child_say()
{
cout<<"Child, Hi!"<<endl;
}
};
Child c;
c.say();
c.child_say();
屬性可以重新定義父類別的成員屬性為較嚴格者
如果是public,繼承下來屬性不變
如果是private,繼承下來都是private
單一類別繼承
class Base {
public:
void say()
{
cout<<"Base, Hi!"<<endl;
}
};
class Child: public Base {
public:
void child_say()
{
cout<<"Child, Hi!"<<endl;
}
};
Child c;
c.say();
c.child_say();
Child
Base
多重類別繼承
如果一個不夠,可以試試兩個
class 子類別 : 屬性:父類別1, 屬性:父類別2 ... {
};
class Base {
public:
void say()
{
cout<<"Base, Hi!"<<endl;
}
};
class Ground {
public:
void ground_say()
{
cout<<"Ground, Hi!"<<endl;
}
};
class Child: public Base, public Ground {
public:
void child_say()
{
cout<<"Child, Hi!"<<endl;
}
};
Child
Base
Ground
class Base {
public:
void say()
{
cout<<"Base, Hi!"<<endl;
}
};
class Ground {
public:
void say()
{
cout<<"Ground, Hi!"<<endl;
}
};
class Child: public Base,public Ground {
public:
void child_say()
{
say(); // which one? or CE?
}
};
Child
Base
Ground
菱形繼承
- 如果今天的繼承是這樣呢?LCQ會有幾個Queue?
虛擬繼承
- 如果繼承的Class為虛擬繼承,會把虛擬的Class合為一個
class 子類別 : virtual 屬性:父類別 {
};
class A {
public:
A(){ cout<<"A!"<<endl; }
};
class B : virtual public A {
public:
B(){ cout<<"B!"<<endl; }
};
class C : virtual public A {
public:
C(){ cout<<"C!"<<endl; }
};
class D : public B, public C {
public:
D(){ cout<<"D!"<<endl; }
};
如果B,C虛擬繼承A
D繼承BC的話就只有1個A
這樣有幾個Queue ?
dynamic_cast
- 繼承的Class間指標可以往被繼承的class移動
C++的多型
多型
- 屬性
- 抽象類別
設計模式
Title Text
- 策略模式
- 觀察者模式(Windown Callback)
- 裝飾者模式(C++ IOStream)
- 工廠模式
- 配接器模式 (STL Stack)
- 迭代器模式 (C++ Iterator)
design pattern
By sylveon
design pattern
- 604