30/09/2018, 17:52

Lỗi `ambiguous call to overloaded function` khi tạo operator của class trong OOP

Chào mọi người,
Mình có vấn đề này muốn hỏi ý kiến của mọi người, mong mọi người giúp mình hiểu rõ vấn đề
Mình làm 1 class phân số vào 3 hàm khởi tạo như sau:

CPhanSo::CPhanSo(){
this->ts = 0;
this->ms = 1;}

CPhanSo::CPhanSo(const CPhanSo &ps){
ts = ps.ts;
ms = ps.ms;}

CPhanSo::CPhanSo(int x = 0, int y = 1){
ts = x;
ms = y;}

Và 1 hàm operator như này:

CPhanSo CPhanSo::operator-(CPhanSo ps){
CPhanSo temp;
temp.ts = ts*ps.ms - ps.ts*ms;
temp.ms = ms*ps.ms;
return temp;}

Thì nó lại báo lỗi : 'CPhanSo::CPhanSo': ambiguous call to overloaded function ở câu lệnh CPhanSo temp; và mình phải sửa lại thành CPhanSo temp(0, 1) ; thì chạy bình thường.

Mình cảm thấy khó hiểu ở chỗ là mình đã có hàm khởi tạo không đối số, khi mình khai báo như vậy thì biến temp phải nhận giá trị là 0/1 mới phải.

Mình đã chạy câu lệnh CPhanSo temp; trong hàm main và nó không báo lỗi vào cho đúng kết quả.
Mong mọi người có thể giải thích giúp mình về lỗi này, cảm ơn mọi người

Nguyễn Trọng Phương viết 20:08 ngày 30/09/2018

CPhanSo::CPhanSo(){
this->ts = 0;
this->ms = 1;}

hàm này sai. Phải sửa lại là:
ts = 0;
ms = 1;

Trương Vĩnh Phú viết 19:53 ngày 30/09/2018

Ban đầu mình cũng làm như bạn, sau mới sửa lại dùng con trỏ this nhưng kq vẫn như nhau. Vẫn báo lỗi

Nguyễn Trọng Phương viết 19:53 ngày 30/09/2018

CPhanSo CPhanSo::operator-(CPhanSo ps){
ts = tsps.ms - ps.tsms;
ms = ms*ps.ms;
return this;}

Sửa lại theo cách này

Trương Vĩnh Phú viết 20:06 ngày 30/09/2018

Cái đó là hàm để làm -= mà bạn. Nếu làm vậy thì sẽ thay đổi giá trị của số trừ rồi. Vd: a = 9 , b =5 thì sau khi - thì a = 4, mình muốn sử dụng a để làm việc khác nên này không tiện.
Cơ bản thì mình thấy code mình đúng nhưng mình không hiểu cái lỗi là gì

Nguyễn Văn Tâm viết 20:02 ngày 30/09/2018

Do ở câu lệnh

CPhanSo temp;

nó không biết nên dùng constructor nào? Dùng constructor không tham số hay constructor có tham số ngầm định

Trương Vĩnh Phú viết 19:56 ngày 30/09/2018

Thế sao cùng câu lệnh đó thì lại chạy được ở hàm main ạ ??

Ngo Dinh Quyen viết 19:55 ngày 30/09/2018

Trong hàm operator bạn có câu lệnh
CPhanSo Temp;
(hàm tạo không truyền vào đối số) nên sẽ xảy ra 2 trường hợp
1- gọi đến hàm tạo không đối
2- gọi đến hàm tạo có 2 đối mặc định và sử dụng cả 2 đối này theo giá trị mặc định
Máy nó không biết phải gọi đến hàm tạo nào nên báo lỗi…

Trương Vĩnh Phú viết 19:53 ngày 30/09/2018

Thank bạn nhiều. Mình đã fix lại theo cách giải thích của bạn vào chương trình chạy ngon rồi

Ngo Dinh Quyen viết 19:57 ngày 30/09/2018

Nếu bạn xây dựng các hàm tạo như trên mà muốn sử dụng hàm tạo có đối mặc định thì phải truyền vào ít nhất 1 tham số thực…nếu không máy sẽ không biết nên dùng hàm tạo nào…

Trương Vĩnh Phú viết 20:00 ngày 30/09/2018

Oke rồi bạn, mình fix lại hàm tạo có đối số truyền vào thì chỉ mặc định thằng y = 1 thôi, tiện cho xây dựng các operator +=, -=, …

Bài liên quan
0