Tài liệu Kỹ thuật lập trình - Chương 9: Khuôn mẫu hàm và khuôn mẫu lớp pptx

23 769 2
Tài liệu Kỹ thuật lập trình - Chương 9: Khuôn mẫu hàm và khuôn mẫu lớp pptx

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

Thông tin tài liệu

Kỹ thuật lập trình Phần III: Lập trình tổng quát Chương 9: Khuôn mẫu hàm khuôn mẫu lớp 0101010101010101100001 0101010101010101100001 StateController 0101010100101010100101 0101010100101010100101 1010011000110010010010 1010011000110010010010 start() 1100101100100010000010 1100101100100010000010 stop() 0101010101010101100001 0101010101010101100001 0101010100101010100101 0101010100101010100101 1010011000110010010010+ B*u; 1010011000110010010010 y = A*x 1100101100100010000010+ d*u; 1100101100100010000010 x = C*x LQGController 0101010101010101100001 0101010101010101100001 0101010100101010100101 0101010100101010100101 start() 1010011000110010010010 stop() 1010011000110010010010 1100101100100010000010 1100101100100010000010 12/25/2007 Nội dung chương 9.1 9.2 Khn mẫu hàm - Vai trị khuôn mẫu hàm - Định nghĩa khuôn mẫu hàm - Sử dụng khuôn mẫu hàm Khuôn mẫu lớp - Định nghĩa khuôn mẫu lớp - Dẫn xuất khuôn mẫu lớp - Ví dụ khn mẫu lớp Vector Chương 9: Khuôn mẫu hàm khuôn mẫu lớp 9.1 Khuôn mẫu hàm (function template) Vấn ₫ề: Nhiều hàm khác kiểu liệu tham số áp dụng, không khác thuật tố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: hàm swap, sort, find, select, Bản chất vấn ₫ề? Nằm ngơn ngữ lập trình cịn thấp, chưa gần với tư người! Giải pháp: Tổng quát hóa hàm khác kiểu liệu áp dụng thành khuôn mẫu hàm Chương 9: Khuôn mẫu hàm khuôn mẫu lớp Định nghĩa khn mẫu hàm Ví dụ tổng qt hóa hàm max ₫ể áp dụng cho nhiều kiểu liệu khác nhau: template T max(T a, T b) { return (a > b)? a : b; } Ví dụ tổng quát hóa hàm swap: template void (X& a, X& b) { X temp = a; a = b; b = temp; } Sử dụng từ khóa typename class ₫ể khai báo tham số khuôn mẫu Một khuôn mẫu hàm inline: template inline T max(T a, T b) { return (a > b)? a : b;} Chương 9: Khuôn mẫu hàm khuôn mẫu lớp Khai báo sử dụng khuôn mẫu hàm Ví dụ sử dụng khn mẫu hàm max template T max(T a, T b); template void swap(T&, T&); Khuôn mẫu hàm void main() { Hàm khuôn mẫu int N1 = 5, N2 = 7; double D1 = 5.0, D2 = 7.0; int N = max(N1,N2); // max(int,int) char c = max('c','a'); // max(char, char) double D = max(D1,D2); // max(double, double) swap(N1,N2); // swap(int&,int&) swap(D1,D2); // swap(double&,double&) D = max(D1,A1); // error: ambiguous N = max('c',A1); // error: ambiguous D = max(D1,A1);// OK: explicit qualification N = max('c',A); // OK: explicit qualification } Chương 9: Khuôn mẫu hàm khuôn mẫu lớp Khả áp dụng khuôn mẫu hàm Khả áp dụng khuôn mẫu hàm vô tận, áp dụng ₫ược cho tất ₫ối số khn mẫu Ví dụ: Điều kiện ràng buộc ₫ối với kiểu liệu áp dụng khn mẫu hàm max phải có phép so sánh lớn (>): template inline T max(T a, T b) { return (a > b)? a : b;} => Đối với kiểu liệu mới, muốn áp dụng ₫ược cần phải nạp chồng toán tử so sánh > Tuy nhiên, khả áp dụng ₫ược chưa ₫ã có ý nghĩa Ví dụ: Xác ₫ịnh chuỗi ký tự ₫ứng sau hai chuỗi cho trước theo vần ABC char city1[] = "Ha Noi", city2[] = "Hai Phong"; char* city = max(city1,city2); // ??? // max(char*,char*) Chương 9: Khuôn mẫu hàm khuôn mẫu lớp Nạp chồng khuôn mẫu hàm Một khn mẫu hàm ₫ược nạp chồng hàm tên char* max(char* a, char* b) { if (strcmp(a,b)) } void f() { char c = max('H','K'); // max(char,char) char city1[] = "Ha Noi", city2[] = "Hai Phong"; char* city = max(city1,city2); // max(char*,char*) } .hoặc khuôn mẫu hàm tên (khác số lượng tham số kiểu tham số), ví dụ: template T max(T a, T b, T c) template T max(T* a, int n) { } { } không ₫ược này: template X max(X a, X b) Chương 9: Khuôn mẫu hàm khuôn mẫu lớp { } Tham số khuôn mẫu Tham số khuôn mẫu hàm kiểu kiểu dẫn xuất, biến số: template max(T a, T b) { } template max(int* a) { } // OK // error Một khn mẫu hàm có tham số kiểu: template void swap(A& a, B& b) { A t = a; a = b; // valid as long as B is compatible to A b = t; // valid as long as A is compatible to B } void f() { double a = 2.0; int b = 3; swap(a,b); // swap(double&,int&) swap(b,a); // swap dễ bao quát, dễ kiểm sốt lỗi, nâng cao hiệu lập trình Đảm bảo ₫ược tính chặt chẽ kiểm tra kiểu mạnh ngơn ngữ lập trình (hơn hẳn sử dụng macro C) Tính mở, nâng cao giá trị sử dụng lại phần mềm: thuật toán viết lần, sử dụng vô số lần Đảm bảo hiệu suất tương ₫ương viết tách thành hàm riêng biệt Cho phép xây dựng thư viện chuẩn mạnh (các thuật tốn thơng dụng chép, tìm kiếm, xếp, lựa chọn, ) Chương 9: Khuôn mẫu hàm khuôn mẫu lớp 11 Nhược ₫iểm khuôn mẫu hàm Nếu muốn ₫ảm bảo tính mở hồn tồn người sử dụng khn mẫu hàm phải có mã nguồn thực thi — Mã nguồn thực thi cần ₫ược ₫ặt header file — Khó bảo vệ chất xám Việc theo dõi, tìm lỗi biên dịch nhiều gặp khó khăn — Lỗi nhiều nằm mã sử dụng, lại ₫ược báo mã ₫ịnh nghĩa khuôn mẫu hàm — Ví dụ: Compiler khơng báo lỗi dịng lệnh sau ₫ây, mà báo lỗi phần ₫ịnh nghĩa hàm max, phép tốn so sánh lớn khơng ₫ược ₫ịnh nghĩa cho kiểu Complex: Complex a, b; Complex c = max(a,b); Định nghĩa sử dụng không ₫úng cách dẫn tới gia tăng lớn mã ₫ích, số lượng hàm khn mẫu ₫ược tạo nhiều không cần thiết Chương 9: Khuôn mẫu hàm khn mẫu lớp 12 Ví dụ: khn mẫu hàm copy template void copy(const S * s, D* d, int n) { while (n ) *d++ = *s++; } void main() { int a[] = {1,2,3,4,5,6,7}; double b[10]; float c[5]; copy(a,b,7); // copy(a,b,7) copy(b,c,5); // copy(b,c,5); } Chương 9: Khuôn mẫu hàm khuôn mẫu lớp 13 9.2 Khuôn mẫu lớp (class template) Nhiều cấu trúc liệu Point, Complex, Vector, List, Map, trước phải ₫ược ₫ịnh nghĩa riêng cho kiểu liệu phần tử cụ thể, ví dụ DoubleComplex, FloatComplex, DoubleVector, IntVector, ComplexVector, DateList, MessageList, Cách thực cấu trúc thực giống nhau, nói chung không phụ thuộc vào kiểu phần tử cụ thể class IntPoint { int x,y; public: IntPoint(int x0, int y0) : x(x0), y(y0) {} }; class DoublePoint { double x,y; public: DoublePoint(double x0, double y0) : x(x0), y(y0) {} }; Chương 9: Khuôn mẫu hàm khuôn mẫu lớp 14 Định nghĩa khuôn mẫu lớp // Point.h template class Point { Tham số khuôn mẫu: T x, y; Kiểu số public: Point(): x(0), y(0) {} Point(T x0, T y0) : x(x0), y(y0) {} Point(const Point&); Mỗi hàm thành void move(T dx, T dy) { x += dx; y+= dy; } viên bool inRect(Point p1, Point p2); khuôn mẫu lớp // khuôn mẫu }; hàm template Point::Point(const Point& b) : x(b.x), y(b.y) {} template bool Point::inRect(Point p1, Point p2) { return (x >= p1.x && x = p2.x && x = p1.y && y = p2.y && x =, 0) data[n] = d; } template Vector::Vector(int n, T* p) { create(n); while (n > 0) data[n] = p[n]; } template Vector::~Vector() { destroy(); } template Vector::Vector(const Vector& a) { create(a.nelem); for (int i=0; i < nelem; ++i) data[i] = a.data[i]; } Chương 9: Khuôn mẫu hàm khuôn mẫu lớp 21 #include "Point.h" #include "Vector.h" void main() Vector v(5,1.0); double d = v[0]; v[1] = d + 2.0; Vector v2(v); // int b[] = {1,2,3,4,5}; Vector a(5,b); int n = a[0]; a[1] = n + 2; Vector a2(a); // typedef Vector Points; Points lines(5,Point(0.0,0.0)); lines[0] = Point(5.0,5.0); // } Chương 9: Khuôn mẫu hàm khuôn mẫu lớp 22 Bài tập nhà Xây dựng khuôn mẫu hàm xác ₫ịnh vị trí (₫ịa chỉ) phần tử có giá trị lớn xuất ₫ầu tiên dãy số Viết chương trình minh họa sử dụng cho hai kiểu số liệu cụ thể Từ tập xây dựng lớp MessageList, tổng qt hóa thành khn mẫu lớp có tên List với phép toán (hàm thành viên) cần thiết Chương 9: Khuôn mẫu hàm khuôn mẫu lớp 23 ... dung chương 9.1 9.2 Khuôn mẫu hàm - Vai trị khn mẫu hàm - Định nghĩa khn mẫu hàm - Sử dụng khuôn mẫu hàm Khuôn mẫu lớp - Định nghĩa khuôn mẫu lớp - Dẫn xuất khn mẫu lớp - Ví dụ khn mẫu lớp Vector... OK! free(p2); } Chương 9: Khuôn mẫu hàm khuôn mẫu lớp Khuôn mẫu hàm hàm khuôn mẫu Khuôn mẫu hàm ₫ưa cách thức thực sử dụng thuật tốn ₫ó cách tổng qt Trong biên dịch khuôn mẫu hàm, compiler kiểm... qualification } Chương 9: Khuôn mẫu hàm khuôn mẫu lớp Khả áp dụng khuôn mẫu hàm Khả áp dụng khuôn mẫu hàm vô tận, áp dụng ₫ược cho tất ₫ối số khuôn mẫu Ví dụ: Điều kiện ràng buộc ₫ối với kiểu liệu áp

Ngày đăng: 19/01/2014, 13:20

Từ khóa liên quan

Mục lục

  • Kỹ thuật lập trìnhPhần III: Lập trình tổng quát

  • Nội dung chương 9

  • 9.1 Khuôn mẫu hàm (function template)

  • Định nghĩa khuôn mẫu hàm

  • Khai báo và sử dụng khuôn mẫu hàm

  • Khả năng áp dụng khuôn mẫu hàm

  • Nạp chồng khuôn mẫu hàm

  • Tham số khuôn mẫu

  • Khuôn mẫu hàm và hàm khuôn mẫu

  • Ưu điểm của khuôn mẫu hàm

  • Nhược điểm của khuôn mẫu hàm

  • Ví dụ: khuôn mẫu hàm copy

  • 9.2 Khuôn mẫu lớp (class template)

  • Định nghĩa khuôn mẫu lớp

  • Sử dụng khuôn mẫu lớp: Lớp khuôn mẫu

  • Những kiểu nào có thể áp dụng?

  • Tham số khuôn mẫu: kiểu hoặc hằng số

  • Dẫn xuất từ khuôn mẫu lớp

  • Ví dụ khuôn mẫu lớp Vector

  • Bài tập về nhà

Tài liệu cùng người dùng

  • Đang cập nhật ...

Tài liệu liên quan