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)
Made with Slides.com