Trang 1 trên tổng số 2 12 Cuối cùngCuối cùng
Từ 1 tới 10 trên tổng số 11 kết quả

Đề tài: [ Solved ]Lỗi nhập nhằng trong chuyển kiểu

  1. #1
    Ngày gia nhập
    03 2008
    Bài viết
    13

    Mặc định [ Solved ]Lỗi nhập nhằng trong chuyển kiểu

    Mình bị lỗi nhập nhằng nhu sau:
    C++ Code:
    1. class phanso
    2. {
    3.     long tu,mau;
    4.     void uocluoc();
    5. public:
    6.     phanso(long t,long m){set(t,m);}
    7.     phanso(long t){set(t,1);}
    8.     void set(long t,long m);
    9.     //phanso operator +(phanso b) ;
    10.     phanso operator *(phanso b);
    11.     friend phanso operator+(phanso a,phanso b);
    12.     friend phanso operator-(phanso a,phanso b);
    13.     operator double (){return double(tu)/double(mau);}
    14.     void xuat();
    15. };
    16. void phanso::set(long t,long m)
    17. {
    18.     if(m)
    19.     {
    20.         tu=t;
    21.         mau=m;
    22.         uocluoc();
    23.     }
    24. }
    25. long ucln(long x,long y)
    26. {
    27.     if(x==y)return x;
    28.     x=abs(x);y=abs(y);
    29.     long tam=abs(x-y);
    30.     if(x>y)return ucln(y,tam);
    31.     return ucln(x,tam);
    32. }
    33. void phanso::uocluoc()
    34. {
    35.     long usc=ucln(tu,mau);
    36.     tu=tu/usc;
    37.     mau=mau/usc;
    38.     if(mau<0){mau=-mau;tu=-tu;}
    39.     if(tu==0)mau=1;
    40.  
    41. }
    42.  
    43. phanso phanso::operator *(phanso b)
    44. {
    45.     return phanso(tu*b.tu,mau*b.mau);
    46. }
    47. phanso operator -(phanso a,phanso b)
    48. {                                  
    49.     return phanso(a.tu*b.mau-a.mau*b.tu,a.mau*b.mau);
    50. }
    51. phanso operator+(phanso a,phanso b);
    52. phanso operator-(phanso a,phanso b);
    53. phanso operator+(phanso a,phanso b)
    54. {
    55.     return phanso(a.tu*b.mau+a.mau*b.tu,a.mau*b.mau);
    56. }
    57. void main()
    58. {
    59.     phanso a(2,3),b(3,4),c(1,1);
    60.     double d;
    61.     d=sqrt(a);
    62.     c=a+b;
    63.     c=a+2; //Lỗi nhập nhang ở đây
    64. }
    nó báo lỗi:error C2666: '+' : 2 overloads have similar conversions
    theo mình nghĩ thì đáng lẽ đâu có bị lỗi đâu vì lệnh c=a+2; nó sẽ tưong đưong với c=a.operator+phanso(2) suy ra nó sẽ chuyển kiểu tư long sang phanso chứ

    Lưu ý bỏ code vào thẻ code nhé cậu !
    Đã được chỉnh sửa lần cuối bởi rox_rook : 31-03-2008 lúc 05:07 AM.

  2. #2
    Ngày gia nhập
    03 2008
    Bài viết
    0

    Ban ui! lần sau để trong tag code nha !
    Mình cũng bị lỗi chô này
    Nói đại khái là định nghĩa phép cộng 2 phân số , gòi định nghĩa kiểu trả về
    gòi chạy dòng lệnh:
    phanso c=a+2;
    thì báo lỗi ?
    Trình dịch báo là có nhiều 2 kiểu chuyễn đổi ? Có ai biết vì sao khôn giải đáp giúp với.Bài số phức của mình cũng lỗi tương tự
    Code:
    #include"iostream.h"
    #include"math.h"
    typedef double datatype;
    class complex{
    	datatype real,img;
    	complex unioncomplex(){
    		complex b;
    		b.img=-img;
    		return b;
    	}
    	datatype modun(){
    		return sqrt(pow(real,2) +pow(img,2));
    	}
    public:
    
    	complex(){
    		real=img=0;
    
    	}
    	complex(datatype r){
    		real=r;img=0;
    
    	}
    	complex(datatype r,datatype i){
    		real=r;img=i;
    	}
    	complex operator+(complex b){
    		complex c;
    		c.real=real+b.real;
    		c.img=img+b.img;
    		return c;
    	}
    	complex operator=(const complex &b){
    		real=b.real;
    		img=b.img;	
    		return (*this);	
    	}
    	operator datatype(){
    		return real;
    	}
    	
    };
    void main(){
    	complex a(5,6);
    	complex c=a+2;// Tại đây trình dịch phát hiện nhiều hơn 1 kiêu chuyển đổi . Vì sao ??
    }

  3. #3
    Ngày gia nhập
    12 2006
    Nơi ở
    US
    Bài viết
    1,917

    rình dịch báo là có nhiều 2 kiểu chuyễn đổi ? Có ai biết vì sao khôn giải đáp giúp với.Bài số phức của mình cũng lỗi tương tự
    Compiler nó không thể implicit convert 1 số sang complex object được, muốn nó + thì phải nói cho nó biết :
    C++ Code:
    1. complex operator+(datatype b){
    2.     return *this + complex(b);
    3.   }
    Tui đã add + comment, cậu đọc sẽ hiểu :
    C++ Code:
    1. //#include"iostream.h"
    2. //#include"math.h"
    3.  
    4. //Đây là standard C++
    5. #include <iostream>
    6. #include <cmath>
    7.  
    8. typedef double datatype;
    9. class complex{
    10. //Thêm private vào, thuộc tính nào thì nói rõ
    11. //ra, không nên để compiler quyết định dùm.
    12. private :
    13.     datatype real,img;
    14.     //hàm này tui chẳng biết nó để làm gì, nhưng không cần
    15.     //phải tạo 1 copy của b như thế, lãng phí
    16.  
    17.     //complex unioncomplex(){
    18.     //  complex b;
    19.     //  b.img=-img;
    20.     //  return b;
    21.     //}
    22.  
    23.     complex unioncomplex(){
    24.       return complex(real, -img);
    25.     }
    26.     //Mũ 2 mà gọi hàm pow thì quá lãng phí.
    27.     //datatype modun(){
    28.         //return sqrt(pow(real,2) +pow(img,2));
    29.     //}
    30.     datatype modun(){
    31.         return sqrt(real*real + img*img);
    32.     }
    33.  
    34. public:
    35.     //complex(){
    36.     //  real=img=0;
    37.     //}
    38.     //Dùng bộ khởi tạo rõ ràng hơn, hoặc dùng
    39.     //biến mặc định dạng :
    40.     //complex(const double = 0.0, const double = 0.0);
    41.     complex():real(0.0), img(0.0){
    42.   }
    43.     //complex(datatype r){
    44.         //real=r;img=0;
    45.     //}
    46.     complex(datatype r):real(r), img(0.0){
    47.   }
    48.     complex(datatype r,datatype i):real(r), img(i){
    49.   }
    50.     //The same issue here, tạo 1 copy của c là không cần thiết
    51.     //complex operator+(complex b){
    52.         //complex c;
    53.         //c.real=real+b.real;
    54.         //c.img=img+b.img;
    55.         //return c;
    56.     //}
    57.     complex operator+(complex b){
    58.       return complex(real + b.real, img + b.img);
    59.     }
    60.     //Cái này là cái cậu cần để + 1 số phức.
    61.     complex operator+(datatype b){
    62.     return *this + complex(b);
    63.   }
    64.  
    65.   //Dữ liệu không có con trỏ, có hay không cũng được.
    66.     //Nên trả về tham chiếu complex& để enable cascading :
    67.     // a = b = c;
    68.     complex& operator=(const complex &b){
    69.         //real=b.real;
    70.         img=b.img; 
    71.         //return (*this); thêm 2 dấu ngoặc làm gì ?
    72.         return *this;
    73.     }
    74.     //Chẳng hiểu hàm này để làm gì ?
    75.     operator datatype(){
    76.         return real;
    77.     }
    78.    
    79. };
    80.  
    81. //void main(){ Don't ever use void main again !!!!
    82. int main(){
    83.     complex a(5,6);
    84.     complex c=a+2.0;// Tại đây trình dịch phát hiện nhiều hơn 1 kiêu chuyển đổi . Vì sao ??
    85.     return 0;
    86. }

  4. #4
    Ngày gia nhập
    12 2006
    Nơi ở
    US
    Bài viết
    1,917

    Lỗi tương tự cho cậu kia, tui đã sữa + comment, tuy nhiên do cậu viết chưa hoàn chỉnh nên tui chỉ sữa những cái tui thấy là cần thiết thôi, còn mấy hàm vẫn chưa thấy cậu viết .
    C++ Code:
    1. #include <iostream>
    2. #include <cmath>
    3. class phanso{
    4. private :
    5.   long tu,
    6.        mau;
    7.   void uocluoc();
    8.     //Thằng này cũng không được gọi bên ngoài class
    9.     //tui nghĩ gán thuộc tính cho nó private thì rõ ràng hơn.
    10.   void set(long t,long m);
    11. public :
    12.     //Dùng bộ khởi tạo thành viên cũng ok.
    13.   phanso(long t,long m):tu(t), mau(m){
    14.   }
    15.   //{set(t,m);}
    16.   phanso(long t):tu(t), mau(1){
    17.   }
    18.   //{set(t,1);}
    19.   //void set(long t,long m);
    20.   phanso operator+(phanso b);
    21.   phanso operator+(long number);//added
    22.   phanso operator*(phanso b);
    23.   friend phanso operator+(phanso a,phanso b);
    24.   friend phanso operator-(phanso a,phanso b);
    25.     //double() là style của C, và không an toàn.
    26.     //dùng static_cast an toàn hơn và nó là C++ style.
    27.   operator double(){
    28.     return static_cast<double>(tu)/static_cast<double>(mau);
    29.   }
    30.   void xuat();//chưa thấy implementation của thằng này.
    31. };
    32.  
    33. void phanso::set(long t,long m){
    34.   if(m){
    35.     tu=t;
    36.     mau=m;
    37.     uocluoc();
    38.   }
    39. }
    40. long ucln(long x,long y){
    41.   if(x==y)return x;
    42.   x=abs(x);y=abs(y);
    43.   long tam=abs(x-y);
    44.   if(x>y)return ucln(y,tam);
    45.   return ucln(x,tam);
    46. }
    47.  
    48. void phanso::uocluoc(){
    49.   long usc=ucln(tu,mau);
    50.   tu=tu/usc;
    51.   mau=mau/usc;
    52.   if(mau<0){mau=-mau;tu=-tu;}
    53.   if(tu==0)mau=1;
    54. }
    55.  
    56. phanso phanso::operator*(phanso b){
    57.   return phanso(tu*b.tu,mau*b.mau);
    58. }
    59.  
    60. phanso operator-(phanso a,phanso b){                                  
    61.   return phanso(a.tu*b.mau-a.mau*b.tu,a.mau*b.mau);
    62. }
    63. //Cái cậu cần là đây
    64. phanso phanso::operator+(long number){
    65.   return *this + phanso(number);
    66. }
    67.  
    68. //2 thằng này vẫn chưa thấy implementation.
    69. phanso operator+(phanso a,phanso b);
    70. phanso operator-(phanso a,phanso b);
    71. phanso operator+(phanso a,phanso b){
    72.   return phanso(a.tu*b.mau+a.mau*b.tu,a.mau*b.mau);
    73. }
    74.  
    75. //void main() DON'T EVER USE VOID MAIN AGAIN !!!
    76. int main(){
    77.     phanso a(2,3),b(3,4),c(1,1);
    78.   double d;
    79.   d=sqrt(a);
    80.   c=a+b;
    81.   c=a+2;//[color="Red"]Lỗi nhập nhang ở đây [/color]
    82. }

  5. #5
    Ngày gia nhập
    10 2007
    Nơi ở
    Gameloft studio
    Bài viết
    175

    Nói dễ hiểu hơn là: các bạn quá tải toán tử cộng hai đối tượng với nhau, chứ không phải các bạn quá tải toán tử cộng đối tượng với một số nguyên.
    Không biết ghi gì luôn ...

  6. #6
    Ngày gia nhập
    03 2008
    Bài viết
    13

    Mặc định [ Solved ]Lỗi nhập nhằng trong chuyển kiểu

    Code:
    void main()
    {
        phanso a(2,3),b(3,4),c(1,1);
        double d;
        d=sqrt(a);
        c=a+b;
        c=a+2;//Lỗi nhập nhang ở đây 
    
    }
    Mình vẫn hhưa thông phần này mình nghĩ ở đây là phải chuyển số 2 sang kiểu phân số chứ(vì mìn khai báo toán tử "+" nó biết chuyển kiểu từ số nguyên sang phân số mà)-->đâu có lỗi gì đâu

  7. #7
    Ngày gia nhập
    12 2006
    Nơi ở
    US
    Bài viết
    1,917

    Mình vẫn hhưa thông phần này mình nghĩ ở đây là phải chuyển số 2 sang kiểu phân số chứ(vì mìn khai báo toán tử "+" nó biết chuyển kiểu từ số nguyên sang phân số mà)-->đâu có lỗi gì đâu
    Nói rõ lại xem, tui không hiểu ý cậu muốn hỏi gì ? Gì mà số nguyên sang phân số ?
    -Constructor nó cũng là cái máy thui, theo default nó có 1 implicit constructor cho dấu = ( nếu dữ liệu không có con trỏ thì ok ). Còn về convert thì làm sao nó hiểu phải tự convert 1 số sang kiểu đối tượng được hả cậu. Cậu phải nói cho nó biết, nó không thể implicit conversion cách này được.

  8. #8
    Ngày gia nhập
    10 2007
    Nơi ở
    Gameloft studio
    Bài viết
    175

    Trích dẫn Nguyên bản được gửi bởi demontaihack Xem bài viết
    Mình vẫn hhưa thông phần này mình nghĩ ở đây là phải chuyển số 2 sang kiểu phân số chứ(vì mìn khai báo toán tử "+" nó biết chuyển kiểu từ số nguyên sang phân số mà)-->đâu có lỗi gì đâu
    Bạn chỉ có quá tải toán tử + với 2 tham số đều là: phanso. Nên khi bạn sử dụng lớp phanso:
    Code:
        phanso a(2,3),b(3,4),c(1,1);
    ...
        c=a+b;
    là đúng với định nghĩa quá tải toán tử + của bạn.
    Nhưng:
    Code:
        c=a+2;
    là sai. Vì bạn chưa quá tải toán tử + với 2 tham số: phanso và số nguyên.
    Bạn hiểu ý mình chứ
    Không biết ghi gì luôn ...

  9. #9
    Ngày gia nhập
    03 2008
    Bài viết
    13

    Ý mình là vầy đoạn code đầu tiên mình đưa ra trong đó bao gồm 2 cách chuyển kiểu:
    1.là chuyển kiểu bằng phưong thức thiết lập
    Code:
    phanso(long t){set(t,1);}
    2.là chuyển kiểu nhờ phép toán chuyển kiểu:
    Code:
    operator double (){return double(tu)/double(mau);}
    khi đó nếu mình:
    int main()
    {
    phanso a(2,3),b(3,4),c(1,1);
    c=a+b;//ok
    c=a+2;//Lỗi nhập nhang ở đây
    //rõ ràng ở đây nó phải dùng cách chuyển kiểu thứ nhất chứ vì phép "+" mình định nghĩa cho 2 phân số nên nó phải convert số 2 sang phanso chứ.

    }

  10. #10
    Ngày gia nhập
    03 2008
    Bài viết
    0

    Mấy ngày nay bận quá nên không lên 4rum được !
    Chà thanks rox_rook với Forlorn_hope giúp đỡ nha

    Trích dẫn Nguyên bản được gửi bởi rox_rook Xem bài viết
    C++ Code:
    1.     //phải tạo 1 copy của b như thế, lãng phí
    2.     //complex unioncomplex(){
    3.     //  complex b;
    4.     //  b.img=-img;
    5.     //  return b;
    6.     //}
    7.     complex unioncomplex(){
    8.       return complex(real, -img);
    9.     }
    Cái chỗ này nếu viết vậy không phải là cũng trả về 1 số complex sao ? Có j khác nhau vậy bạn ???

    Trích dẫn Nguyên bản được gửi bởi rox_rook Xem bài viết
    C++ Code:
    1.    
    2.     //Cái này là cái cậu cần để + 1 số phức.
    3. complex operator+(datatype b){
    4.     return *this + complex(b);
    5.  }
    6.     //Chẳng hiểu hàm này để làm gì ?
    7. operator datatype(){
    8.         return real;
    9. }
    Hàm operator dùng để ép kiểu , khi ta cộng 1 thực với số fức thì sẽ tự động chuyển fức thành thực gòi thực hiện cộng theo số nguyên , hàm này chỉ có tác dụng giảm đi số lần cài đặt hàm bạn : friend complex operator+(datatype k,complex a ) , để định nghĩa cộng thực và fức ! Nhưng có lẽ vô tình nó gây ra rắc rối khi số phức cộng cho số thực ?

    Khi gặp c=a+2; mình nghĩ có lẽ có 2 trường hợp xảy ra :

    *trình biên dịch sẽ chuyển a thành số thực do hàm chuyển kiểu gòi cộng cho 2 . Gòi mới gọi hàm thiết lập cho c bằng số thực

    *trình biên dịch sẽ chuyển 2 là số fức gòi gỏi thực hiện phép cộng số fức ,gòi mới gọi hàm thiết lập sao chép c giống số fức (a+2);

    Lúc nào có lỗi nhập nhằng ! Mình nghĩ vậy đó ! Chắc là sai chỗ đó , không biết đúng không nữa ? Có cách nào chỉnh không nhỉ , chứ thêm hàm chuyển kiểu mình nghĩ sẽ tiết kiệm đc khá nhiều dòng ( lý do nói trên gòi đó )

    Trích dẫn Nguyên bản được gửi bởi rox_rook Xem bài viết
    //void main(){ Don't ever use void main again !!!!
    Tại sao vậy bạn ???Có thể giải thik cho mình đc ko ??

Các đề tài tương tự

  1. Không cho di chuyển ra khỏi cell trong Datagridview khi nhập sai
    Gửi bởi nguyen.kiepdatrang trong diễn đàn Thắc mắc lập trình C#
    Trả lời: 11
    Bài viết cuối: 10-05-2013, 05:20 PM
  2. [ Solved ]Cho hỏi về nhập xuất trong đồ họa ?
    Gửi bởi Kakakatt trong diễn đàn Nhập môn lập trình C/C++
    Trả lời: 18
    Bài viết cuối: 25-11-2008, 11:43 AM
  3. [ Solved ] Đường đi dài nhất trong đồ thị có hướng, ai biết giúp mình với, thank
    Gửi bởi popochacha20 trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 6
    Bài viết cuối: 22-11-2008, 09:22 AM
  4. Cách nhập và xuất dữ liệu trong MS office trong C++?
    Gửi bởi long.bkiter07 trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 1
    Bài viết cuối: 19-11-2008, 09:09 AM
  5. [Solved]Lấy giá trị lớn nhất trong CSDL
    Gửi bởi katz trong diễn đàn Thắc mắc đại cương Database & Reporting
    Trả lời: 4
    Bài viết cuối: 27-01-2008, 10:57 PM

Quyền hạn của bạn

  • Bạn không thể gửi đề tài mới
  • Bạn không thể gửi bài trả lời
  • Bạn không thể gửi các đính kèm
  • Bạn không thể chỉnh sửa bài viết của bạn