I. QUÁ TRÌNH THIẾT KẾ HỆ THỐNG SỐ.
Constructor trong C++
// ... private: T* _data; int _capacity; int _size; }; template<typename T> Array<T>::Array(int size): _size(size), _capacity(_size + 10), _data(new T[_capacity]) {} int main() { Array<int> a(100); . . . // chương trình bắt đầu thực // hiện từng phần } Lỗi: Array<T>::Array(int size) : _size(size), _capacity(size + 10), _data(new T[_capacity]) {} Khắc phục:
Phải khởi tạo các biến thành viên theo đúng thứ tự đã khai báo! Array<T>::Array(int size) : _data(new T[_capacity]) _capacity(_size + 10), _size(size), Thủ thuật:
Không sử dụng các biến thành viên trong quá trình khởi tạo. Array<T>::Array(int size) : _data(new T[size + 10]) _capacity(size + 10), _size(size), Ví dụ 5: class Point { public: Point(double x = 0, double y = 0); // ... private: double _x, _y; }; int main() { double a, r, x, y; // ...
Point p = (x + r * cos(a), y + r * sin(a)); // ...
return 0; }
Lỗi:
Point p = (x + r * cos(a), y + r * sin(a)); Câu lệnh trên có thể là:
Point p(x + r * cos(a), y + r * sin(a)); Hay:
Point p = Point(x + r * cos(a), y + r * sin(a)); Biểu thức:
(x + r * cos(a), y + r * sin(a))
có một ý nghĩa khác. Dấu phẩy trong biểu thức dùng để bỏ qua giá trị x + r * cos(a) và chỉ tính giá trị y + r * sin(a). Constructor:
point (double x = 0, double y = 0) khởi tạo một Point(y + r * sin(a) , 0).
Khắc phục:
Đối số mặc định có thể dẫn đến một lời gọi hàm không mong muốn. Trong trường hợp của chúng ta, cấu trúc Point (double) không hợp lý, nhưng Point ( ) thì ngược lại. Chỉ dùng giá trị mặc định cho đối số khi tất cả các mẫu gọi hàm đều cho kết quả có nghĩa.
Ví dụ 6: class Shape { public: Shape(); private:
virtual void reset(); Color _color; };
class Point : public Shape
{ public: // ... private: double _x, _y; };
void Shape::reset() { _color =
BLACK; } void Point::reset() { Shape::reset(); _x = 0; _y = 0; } Shape::Shape() { reset(); }
Không có constructor Point trong ví dụ này, ta sử dụng hàm ảo trong constructor Shape.
Lỗi:
Shape::Shape() { reset(); } Point p;
Khi xây dựng Point, hàm Shape::reset () chứ không phải hàm ảo Point::reset () được gọi. Tại sao?
Giải thích: hàm ảo không hoạt động trong constructor. Đối tượng con Shape được xây dựng trước đối tượng Point. Bên trong constructor Shape, việc xây dựng đối tượng một cách riêng rẽ cũng tạo ra một đối tượng thuộc lớp Shape.
Trong cuộc cạnh tranh khốc liệt với Netscape, Internet Explorer đã cố gắng thu hút người dùng bằng rất nhiều chức năng thú vị, tiện dụng. Một vấn đề khác cũng quan trọng không kém là các phần mềm của hãng thứ ba. Chính vì thế nên Microsoft cũng cung cấp rất nhiều cách để các lập trình viên có thể tiếp cận được với Internet Explorer. Một trong những “thứ thú vị” đó là tùy biến Context Menu của IE (Menu hiện ra khi bạn click chuột phải vào trang Web).
Nếu như bạn đã dùng IE, hẳn bản phải biết mỗi khi chúng ta nhấp chuột phải vào một Picture thì sẽ có một Menu xuất hiện cho phép sử dụng Picture đó làm Wallpaper, làm sao chương trình biết được chính xác bạn đã chọn hình nào? Hay như các chương trình hỗ trợ việc Download (NetAnts ...), mỗi khi bạn nhấp chuột phải vào một link, thì sẽ xuất hiện một menu con của chương trình giúp bạn Download link đã chọn, làm sao chương trình đó nhúng menu của nó vào menu của IE và làm sao chương trình đó biết được bạn đã chọn Link nào?
1.Nhúng Menu của bạn vào Menu của Internet Explorer
Để thêm một MenuItem vào Menu của IE rất đơn giản, bạn chỉ cần tạo một khóa (subkey) trong Registry ở khóa HKEY_CURRENT_USER \Software\
Microsoft\Internet Explorer\MenuExt\
. Nếu bạn không biết sử dụng Registry thì hãy tìm hiểu một chút về Registry rồi tiếp tục.
Tên của khóa chính là Caption của Menu mà bạn muốn thêm vào. Bạn có thể sử dụng kí tự “&” để xác định kí tự sẽ được gạch chân. Kí tự đứng ngay sau “&” sẽ được gạch chân (phím tắt). Đặt giá trị Default của nó là đường dẫn của tập tin mà bạn muốn nó chạy mỗi khi người dùng click vào menu mà bạn mới tạo ra. Ví dụ bạn muốn tạo một Menu có tên là My Cool Menu, mỗi khi click vào Menu này thì sẽ chạy chương trình Notepad (Nói trước để bạn khỏi phải bực mình, nó sẽ không hoạt động như ta mong muốn), thì bạn sẽ tạo một khóa như trong hình minh họa. Và bạn hãy mở