LẬP TRÌNH C/C++ NÂNG CAO Yêu cầu trước khi đọc học xong Lập trình C/C++ căn bản BÀI 13 RTTI, I/O, EXTERN VÀ PREPROCESSOR DIRECTIVE RTTI (Runtime type identification) Trong Java, để biết một object có[.]
LẬP TRÌNH C/C++ NÂNG CAO Yêu cầu trước đọc: học xong Lập trình C/C++ BÀI 13: RTTI, I/O, EXTERN VÀ PREPROCESSOR DIRECTIVE RTTI (Runtime type identification) Trong Java, để biết object có phải instance class hay không, ta dùng instanceof if(os instanceof ostream) Trong C++ ta dùng hàm typeid if(typeid(os)==typeid(ostream)) Trong C++, ta muốn overload toán tử xuất > (input) lần với istream ifstream, ifstream lớp istream Khi phát triển game thương mại lớn để "lọt sổ" lỗi ngầm khó phát có "chuyện gì" xảy ra, với số lượng kinh hồng lớp tốn tử phát triển thời gian tìm sửa lỗi kinh hồng Do đó, để đảm bảo an tồn, phải overload tốn tử cho lớp cha con, phải sử dụng RTTI Ta sử dụng RTTI cách dùng typeid downcast dynamic_cast RTTI (Runtime type identification) (xác định kiểu liệu lúc thực thi) Lúc thực thi, chương trình xác định kiểu liệu object xác instance cha hay Trước hết, ta viết riêng hàm cho trước Nếu xác định instance con, ta ép kiểu object xuống thành kiểu cho thực hàm ta viết riêng cho Nếu thực hàm cha bình thường Lớp cha phải có hàm ảo (istream ostream thỏa điều này) Ví dụ ta viết hàm printToFile readFromFile dành cho (ofstream ifstream) trước dùng typeid downcast CODE #include #include using namespace std; class Person{ char* name; public: Person(){} Person(char* name):name(name){} void setName(char* name){ (*this).name = new char[strlen(name)+1]; strcpy((*this).name,name); } char* getName() const{return name;} void printToFile(ofstream& os) const{os*this;} friend ostream& operator ; Từ khóa extern Từ khóa extern thơng báo với trình biên dịch phần chương trình liên kết với ngôn ngữ khác khai báo theo qui ước khác phần chương trình khác Trường hợp thứ nhất: ta có tập tin c.obj chứa mã nhị phân hàm dosomething viết C Bây ta muốn viết chương trình C++ sử dụng thư viện Ta khai báo main.cpp CODE extern "C" { void dosomething(int i); } int main(int argc,char** argv) { dosomething(5); } Trường hợp thứ hai: ta có thư viện đồ họa viết C graphics.lib tập tin header graphics.h Bây ta muốn viết chương trình C++ sử dụng thư viện Ta khai báo main.cpp CODE extern "C" { #include "graphics.h" } Trường hợp thứ ba: ta có dự án có tập tin 1.cpp 2.cpp dó biến a hàm in khai báo tập tin 1.cpp sau CODE int a=7; void in(int a){couts3>> ; Từ khóa extern Từ khóa extern thơng báo với trình biên dịch phần chương trình liên kết với ngơn ngữ kh? ?c khai báo theo qui ư? ?c kh? ?c phần chương trình kh? ?c Trường hợp