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
hàm này sai. Phải sửa lại là:
ts = 0;
ms = 1;
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
Sửa lại theo cách này
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ì
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
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…
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
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…
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 +=, -=, …