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 :smile:

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

1 Like

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 :frowning:

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

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ì :smiley:

Do ở câu lệnh

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 :grin:

1 Like

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

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…

2 Likes

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 :smile:

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…

1 Like

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 +=, -=, …

83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?