Bây giờ chúng tôi lại thay đổi code một chút, bạn hãy thử tìm điểm khác biệt trong source code phía dưới →
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
#include <iostream> using namespace std class Element { int value; public: Element(int val) { value = val; cout << "Element(" << val << ") constructed!" << endl; } int Get(void) { return value; } void Put(int val) { value = val; } } class Collection { Element el1, el2; public: Collection(void) { cout << "Collection constructed!" << endl; } int Get(int elno) { return elno == 1 ? el1.Get() : el2.Get(); } int Put(int elno, int val) { if(elno == 1) el1.Put(val); else el2.Put(val); } }; int main(void) { Collection coll; return 0; } |
Vâng, chúng tôi đã thay đổi dạng của constructor của class Element – trước đó nó là một hàm không tham số, bây giờ nó cần một tham số kiểu int.
Sửa đổi đó đã làm chương trình không thể biên dịch được. Tại sao vậy ? Trình biên dịch thông báo lỗi đại loại như thế này:
1 2 |
In constructor 'Collection::Collection()': error: no matching function for call to 'Element::Element()' |
Constructor được gọi ngầm (đôi khi được gọi là constructor mặc định – default constructor) là một constructor không có tham số. Chúng tôi đã không đưa ra một constructor như vậy. Chúng tôi cũng không cung cấp hàm khởi tạo sao chép (copying constructor). Constructor duy nhất đang có thì không tương thích với constructor mặc định và constructor sao chép, và điều này làm cho chương trình không thể biên dịch được.
Làm thế nào chúng ta có thể giải quyết vấn đề này ? Có thủ thuật nào đó để nói với trình biên dịch rằng chúng ta muốn nó sử dụng constructor khác thay vì cái mặc định không ?
Câu trả lời là: Có. Ngôn ngữ C++ cung cấp cho chúng ta một cú pháp đặc biệt cho trường hợp này và các tình huống tương tự