
Kỹthuật lập trình
Phần III: Lập trình tổng quát
0101010101010101100001
0101010101010101100001
0101010101010101100001
0101010100101010100101
0101010100101010100101
0101010100101010100101
1010011000110010010010
1010011000110010010010
1010011000110010010010
1100101100100010000010
1100101100100010000010
1100101100100010000010
0101010101010101100001
0101010101010101100001
0101010101010101100001
0101010100101010100101
0101010100101010100101
0101010100101010100101
1010011000110010010010
1010011000110010010010
1010011000110010010010
1100101100100010000010
1100101100100010000010
1100101100100010000010
0101010101010101100001
0101010101010101100001
0101010101010101100001
0101010100101010100101
0101010100101010100101
0101010100101010100101
1010011000110010010010
1010011000110010010010
1010011000110010010010
1100101100100010000010
1100101100100010000010
1100101100100010000010
y = A*x + B*u;
x = C*x + d*u;
StateController
start()
stop()
LQGController
start()
stop()
Chương 9:
Khuôn mẫu hàm và khuôn mẫulớp
12/25/2007

2
Chương 9: Khuôn mẫu hàm và khuôn mẫulớp
Nộidung chương 9
9.1 Khuôn mẫuhàm
-Vaitròcủa khuôn mẫuhàm
-Định nghĩa khuôn mẫuhàm
-Sửdụng khuôn mẫuhàm
9.2 Khuôn mẫulớp
-Định nghĩa khuôn mẫulớp
-Dẫnxuất khuôn mẫulớp
-Vídụkhuôn mẫulớp Vector

3
Chương 9: Khuôn mẫu hàm và khuôn mẫulớp
9.1 Khuôn mẫuhàm(function template)
Vấn ₫ề: Nhiều hàm chỉkhác nhau vềkiểu dữliệu tham sốáp
dụng, không khác nhau vềthuật toán
Ví dụ:
int max(int a, int b) {
return (a > b)? a : b;
}
double max(double a, double b) {
return (a > b)? a : b;
}
...
Các ví dụkhác: các hàm swap, sort, find, select,...
Bản chất của vấn ₫ề? Nằm ởngôn ngữlập trình còn thấp, chưa
gần với tư duy của con người!
Giải pháp: Tổng quát hóa các hàm chỉkhác nhau vềkiểu dữ
liệu áp dụng thành khuôn mẫu hàm.

4
Chương 9: Khuôn mẫu hàm và khuôn mẫulớp
Định nghĩakhuônmẫuhàm
Ví dụtổng quát hóa hàm max ₫ể có thểáp dụng cho nhiềukiểu
dữliệu khác nhau:
template <typename T>
T max(T a, T b) {
return (a > b)? a : b;
}
Ví dụtổng quát hóa hàm swap:
template <class X>
void (X& a, X& b) {
X temp = a;
a = b;
b = temp;
}
Mộtkhuônmẫuhàminline:
template <typename T>
inline T max(T a, T b) { return (a > b)? a : b;}
Sửdụng từkhóa typename
hoặcclass ₫ể khai báo tham
sốkhuôn mẫu

5
Chương 9: Khuôn mẫu hàm và khuôn mẫulớp
Khai báo và sửdụng khuôn mẫuhàm
Ví dụsửdụng khuôn mẫuhàmmax
template <class T> T max(T a, T b);
template <class T> void swap(T&, T&);
void main() {
int N1 = 5, N2 = 7;
double D1 = 5.0, D2 = 7.0;
int N = max(N1,N2); // max<int>(int,int)
char c = max('c','a'); // max<char>(char, char)
double D = max(D1,D2); // max<double>(double, double)
swap(N1,N2); // swap<int>(int&,int&)
swap(D1,D2); // swap<double>(double&,double&)
D = max(D1,A1); // error: ambiguous
N = max('c',A1); // error: ambiguous
D = max<double>(D1,A1);// OK: explicit qualification
N = max<int>('c',A); // OK: explicit qualification
}
Khuôn mẫuhàm
Hàm khuôn mẫu