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: Lỗi "cannot convert 'this' pointer ..."

  1. #1
    Ngày gia nhập
    07 2011
    Bài viết
    22

    Exclamation Lỗi "cannot convert 'this' pointer ..."

    Mình coded bài tập phần class như sau
    Code:
    #include <iostream.h>
    #include <math.h>
    class diem
    {
    private:
    	int x,y;
    public:
    	diem(int xx=0,int yy=0);
    	diem(const diem &u);
    	void nhap();
    	void xuat();
    	void dichuyen(int dx,int dy);
    	int trung(const diem &u);
    	diem doixung();
    	double kc(const diem &u);
    	int hople(const diem &u,const diem &v);//kiem tra 3 diem co tao thanh tam giac ko
    	double cv(diem &u,diem &v);
    	double dt(diem &u,diem &v);
    };
    diem::diem(int xx,int yy)
    {
    	x=xx;
    	y=yy;
    }
    diem::diem(const diem &u)
    {
    	x=u.x;
    	y=u.y;
    }
    void diem::nhap()
    {
    	cout<<"Nhap toa do:";
    	cin>>x>>y;
    }
    void diem::xuat()
    {
    	cout<<x<<","<<y<<endl;
    }
    void diem::dichuyen(int dx,int dy)
    {
    	x+=dx;
    	y+=dy;
    }
    int diem::trung(const diem &u)
    {
    	if(x==u.x && y==u.y)
    		return 1;
    	else
    		return 0;
    }
    diem diem::doixung()
    {
    	diem ret;
    	ret.x=-x;
    	ret.y=-y;
    	return ret;
    }
    double diem::kc(const diem &u)
    {
    	return sqrt(pow(u.x-x,2)+pow(u.y-y,2));
    }
    int diem::hople(const diem &u,const diem &v)
    {
    	double d1=(*this).kc(u);
    	double d2=u.kc(v);
    	double d3=v.kc(*this);
    	if(d1+d2>=d3 && d1+d3>=d2 && d3+d2>=d1)
    		return 1;
    	else
    		return 0;
    }
    void main()
    {
    	diem a(0,0);
    	diem b(1,0);
    	diem c(0,1);
    	if(a.hople(b,c))
    		cout<<"3 diem a,b,c co the tao thanh tam giac\n";
    }
    khi chạy cứ báo lối "cannot convert 'this' pointer from 'const class diem' to 'class diem &'
    Conversion loses qualifiers"
    , nhờ các bạn xem giúp mình với

  2. #2
    Ngày gia nhập
    12 2010
    Nơi ở
    Hanoi, Vietnam, Vietnam
    Bài viết
    687

    của bạn đây , thực ra bạn có thay đổi tọa độ của u thay = v , và con trỏ this nên bạn ko thể để const đc ! bạn chỉ để tham chiếu thôi !

    C++ Code:
    1. #include <iostream.h>
    2. #include <math.h>
    3. using namespace std;
    4. class diem
    5. {
    6. private:
    7.     int x,y;
    8. public:
    9.     diem(int xx=0,int yy=0);
    10.     diem(const diem &u);
    11.     void nhap();
    12.     void xuat();
    13.     void dichuyen(int dx,int dy);
    14.     int trung(const diem &u);
    15.     diem doixung();
    16.     double kc( diem &u);
    17.     int hople( diem &u, diem &v);//kiem tra 3 diem co tao thanh tam giac ko
    18.     double cv(diem &u,diem &v);
    19.     double dt(diem &u,diem &v);
    20. };
    21. diem::diem(int xx,int yy)
    22. {
    23.     x=xx;
    24.     y=yy;
    25. }
    26. diem::diem(const diem &u)
    27. {
    28.     x=u.x;
    29.     y=u.y;
    30. }
    31. void diem::nhap()
    32. {
    33.     cout<<"Nhap toa do:";
    34.     cin>>x>>y;
    35. }
    36. void diem::xuat()
    37. {
    38.     cout<<x<<","<<y<<endl;
    39. }
    40. void diem::dichuyen(int dx,int dy)
    41. {
    42.     x+=dx;
    43.     y+=dy;
    44. }
    45. int diem::trung(const diem &u)
    46. {
    47.     if(x==u.x && y==u.y)
    48.         return 1;
    49.         return 0;
    50. }
    51. diem diem::doixung()
    52. {
    53.     diem ret;
    54.     ret.x=-x;
    55.     ret.y=-y;
    56.     return ret;
    57. }
    58. double diem::kc( diem &u)
    59. {
    60.     return sqrt((pow((double)(this->x-u.x),2))+pow(((double)(this->y-u.y)),2));
    61. }
    62. int diem::hople( diem &u,diem &v)
    63. {
    64.     double d1=(*this).kc(u);
    65.     double d2 = u.kc(v);
    66.     double d3= v.kc(*this);
    67.     if(d1+d2>=d3 && d1+d3>=d2 && d3+d2>=d1)
    68.         return 1;
    69.     else
    70.         return 0;
    71. }
    72. void main()
    73. {
    74.     diem a(0,0);
    75.     diem b(1,0);
    76.     diem c(0,1);
    77.     if(a.hople(b,c))
    78.         cout<<"3 diem a,b,c co the tao thanh tam giac\n";
    79.     cin.get();
    80. }

  3. #3
    Ngày gia nhập
    07 2011
    Bài viết
    22

    Trích dẫn Nguyên bản được gửi bởi xuyenit55 Xem bài viết
    của bạn đây , thực ra bạn có thay đổi tọa độ của u thay = v , và con trỏ this nên bạn ko thể để const đc ! bạn chỉ để tham chiếu thôi !

    C++ Code:
    1. #include <iostream.h>
    2. #include <math.h>
    3. using namespace std;
    4. class diem
    5. {
    6. private:
    7.     int x,y;
    8. public:
    9.     diem(int xx=0,int yy=0);
    10.     diem(const diem &u);
    11.     void nhap();
    12.     void xuat();
    13.     void dichuyen(int dx,int dy);
    14.     int trung(const diem &u);
    15.     diem doixung();
    16.     double kc( diem &u);
    17.     int hople( diem &u, diem &v);//kiem tra 3 diem co tao thanh tam giac ko
    18.     double cv(diem &u,diem &v);
    19.     double dt(diem &u,diem &v);
    20. };
    21. diem::diem(int xx,int yy)
    22. {
    23.     x=xx;
    24.     y=yy;
    25. }
    26. diem::diem(const diem &u)
    27. {
    28.     x=u.x;
    29.     y=u.y;
    30. }
    31. void diem::nhap()
    32. {
    33.     cout<<"Nhap toa do:";
    34.     cin>>x>>y;
    35. }
    36. void diem::xuat()
    37. {
    38.     cout<<x<<","<<y<<endl;
    39. }
    40. void diem::dichuyen(int dx,int dy)
    41. {
    42.     x+=dx;
    43.     y+=dy;
    44. }
    45. int diem::trung(const diem &u)
    46. {
    47.     if(x==u.x && y==u.y)
    48.         return 1;
    49.         return 0;
    50. }
    51. diem diem::doixung()
    52. {
    53.     diem ret;
    54.     ret.x=-x;
    55.     ret.y=-y;
    56.     return ret;
    57. }
    58. double diem::kc( diem &u)
    59. {
    60.     return sqrt((pow((double)(this->x-u.x),2))+pow(((double)(this->y-u.y)),2));
    61. }
    62. int diem::hople( [B]diem &u,diem &v[/B])
    63. {
    64.     double d1=(*this).kc(u);
    65.     double d2 = u.kc(v);
    66.     double d3= v.kc(*this);
    67.     if(d1+d2>=d3 && d1+d3>=d2 && d3+d2>=d1)
    68.         return 1;
    69.     else
    70.         return 0;
    71. }
    72. void main()
    73. {
    74.     diem a(0,0);
    75.     diem b(1,0);
    76.     diem c(0,1);
    77.     if(a.hople(b,c))
    78.         cout<<"3 diem a,b,c co the tao thanh tam giac\n";
    79.     cin.get();
    80. }
    Bạn ơi nếu chuyển u,v trong hàm hople thành tham chiếu thì mình chạy ok nhưng nhập điểm bất kì nào vào cũng return về 1 hết !!!!xem lại giúp mình nhé

  4. #4
    Ngày gia nhập
    07 2011
    Bài viết
    22

    Ah bạn mìh hỏi thêm về cái VC++ 6.0 cài thêm VS XX, thì mỗi lần build xong chạy được rồi, mà lỡ bấm build lại lần nữa thì nó báo lỗi là "cannot open Debug/bt1.exe for writing
    Error executing link.exe."
    , phải vào trong thư mục debug xóa bỏ [tenfile.exe] đi mới build lại đc, có cách nào khắc phục tình trạng này hok?

  5. #5
    Ngày gia nhập
    07 2011
    Bài viết
    160

    Cách sửa của xuyenit, dù làm cho chương trình chạy được nhưng lại làm mất đi tính const-correctness
    Const-correctness cần được đưa vào từ lúc thiết kế, dựa theo chức năng của mỗi function và đối số hàm
    Cụ thể:
    -Tham số hàm nào không cần thay đổi thì khai báo const
    -Hàm nào không làm thay đổi *this thì thay báo const

    Vì vậy theo ngữ nghĩa của hàm tính khoảng cách, và kiểm tra trùng, kiểm tra độ hợp lệ thì các hàm này cũng phải khai báo const, và sử dụng các tham số cũng là const (Chỉ sửa const cho function kc là đủ để chương trình chạy được - nhưng nên làm cho đúng hết)
    Bạn khai báo như sau: (phần declaration của class cũng phải thay đổi tương ứng)
    C++ Code:
    1. int diem::trung(const diem &u) const {...}
    2. double diem::kc(const diem &u) const {...}
    3. int diem::hople(const diem &u,const diem &v) const {}

    Các bạn chưa quen có thể thấy để theo đúng const-correctness là phức tạp lằng nhằng rắc rối. Nhưng làm nhiều sẽ thấy nó có lợi nhiều hơn có hại

    Edit: Úi còn function doixung nữa:
    C++ Code:
    1. diem diem::doixung() const
    2. {
    3.   return diem(-x, -y);
    4. }
    Đã được chỉnh sửa lần cuối bởi fbchicken : 20-08-2011 lúc 10:18 AM.

  6. #6
    Ngày gia nhập
    12 2010
    Nơi ở
    Hanoi, Vietnam, Vietnam
    Bài viết
    687

    Mặc định Lỗi "cannot convert 'this' pointer ..."

    C++ Code:
    1. #include <iostream>
    2. #include <cmath>
    3. using namespace std;
    4. class diem
    5. {
    6. private:
    7.     int x,y;
    8. public:
    9.     diem(int xx=0,int yy=0);
    10.     diem(const diem &u);
    11.     void nhap();
    12.     void xuat();
    13.     void dichuyen(int dx,int dy);
    14.     int trung(const diem &u);
    15.     diem doixung();
    16.     double kc( diem &u);
    17.     int hople( diem &u, diem &v);//kiem tra 3 diem co tao thanh tam giac ko
    18.     double cv(diem &u,diem &v);
    19.     double dt(diem &u,diem &v);
    20. };
    21. diem::diem(int xx,int yy)
    22. {
    23.     x=xx;
    24.     y=yy;
    25. }
    26. diem::diem(const diem &u)
    27. {
    28.     x=u.x;
    29.     y=u.y;
    30. }
    31. void diem::nhap()
    32. {
    33.     cout<<"Nhap toa do:";
    34.     cin>>x>>y;
    35. }
    36. void diem::xuat()
    37. {
    38.     cout<<x<<","<<y<<endl;
    39. }
    40. void diem::dichuyen(int dx,int dy)
    41. {
    42.     x+=dx;
    43.     y+=dy;
    44. }
    45. int diem::trung(const diem &u)
    46. {
    47.     if(x==u.x && y==u.y)
    48.     {
    49.         return 1;
    50.     }
    51.         return 0;
    52. }
    53. diem diem::doixung()
    54. {
    55.     diem ret;
    56.     ret.x=-x;
    57.     ret.y=-y;
    58.     return ret;
    59. }
    60. double diem::kc( diem &u)
    61. {
    62.     return sqrt((pow((double)(this->x-u.x),2))+pow(((double)(this->y-u.y)),2));
    63. }
    64. int diem::hople( diem &u,diem &v)
    65. {
    66.       // thêm phần này kiểm tra nếu nó có hợp lệ hay ko , nếu nó ko hợp lệ thì return 0;
    67.       // còn nếu nó ko hợp lệ thì tính khoảng cách của nó
    68.     double d1=(*this).kc(u);
    69.     double d2 = u.kc(v);
    70.     double d3= v.kc(*this);
    71.     if(d1+d2>=d3 && d1+d3>=d2 && d3+d2>=d1)
    72.     {
    73.         return 1;
    74.     }
    75.         return 0;
    76. }
    77. int main()
    78. {
    79.     //diem a(0,0);
    80.     //diem b(1,0);
    81.     //diem c(0,1);
    82.     diem a,b,c;
    83.     a.nhap();
    84.     a.xuat();
    85.     b.nhap();
    86.     b.xuat();
    87.     c.nhap();
    88.     c.xuat();
    89.     if(a.hople(b,c))
    90.     {
    91.         cout<<"3 diem a,b,c co the tao thanh tam giac\n";
    92.     }
    93.     else cout << "3 diem ko hop le ";
    94.     //cin.get();
    95.     system ("pause");
    96. }
    bạn code lại nhá , cái phần hợp lệ ban đầu bạn phải kiểm tra xem nó có hợp lệ hay ko , có nghĩa là các điểm của nó có trùng nhau hay ko ! còn thì bạn nhập thế nào nó cũng hợp lệ hết !

  7. #7
    Ngày gia nhập
    07 2011
    Bài viết
    22

    Trích dẫn Nguyên bản được gửi bởi fbchicken Xem bài viết
    Cách sửa của xuyenit, dù làm cho chương trình chạy được nhưng lại làm mất đi tính const-correctness
    Const-correctness cần được đưa vào từ lúc thiết kế, dựa theo chức năng của mỗi function và đối số hàm
    Cụ thể:
    -Tham số hàm nào không cần thay đổi thì khai báo const
    -Hàm nào không làm thay đổi *this thì thay báo const

    Vì vậy theo ngữ nghĩa của hàm tính khoảng cách, và kiểm tra trùng, kiểm tra độ hợp lệ thì các hàm này cũng phải khai báo const, và sử dụng các tham số cũng là const (Chỉ sửa const cho function kc là đủ để chương trình chạy được - nhưng nên làm cho đúng hết)
    Bạn khai báo như sau: (phần declaration của class cũng phải thay đổi tương ứng)
    C++ Code:
    1. int diem::trung(const diem &u) const {...}
    2. double diem::kc(const diem &u) const {...}
    3. int diem::hople(const diem &u,const diem &v) const {}

    Các bạn chưa quen có thể thấy để theo đúng const-correctness là phức tạp lằng nhằng rắc rối. Nhưng làm nhiều sẽ thấy nó có lợi nhiều hơn có hại

    Edit: Úi còn function doixung nữa:
    C++ Code:
    1. diem diem::doixung() const
    2. {
    3.   return diem(-x, -y);
    4. }
    Mình vẫn còn thấy lờ mờ phần "tính const-correctness", bạn có thể nói rõ hơn chút nữa hok? khi nào mình cần khai báo const , khi nào ko cần khai báo

  8. #8
    Ngày gia nhập
    07 2011
    Bài viết
    160

    Trích dẫn Nguyên bản được gửi bởi loveboom3012 Xem bài viết
    Bạn ơi nếu chuyển u,v trong hàm hople thành tham chiếu thì mình chạy ok nhưng nhập điểm bất kì nào vào cũng return về 1 hết !!!!xem lại giúp mình nhé
    Bởi vì function hople của bạn luôn trả về 1! Nó kiểm tra AB + BC >= AC, mà điều này luôn đúng với mọi điểm A, B, C
    Mình không hiểu ý nghĩa của hople là gì, nhưng điều kiện để kiểm tra 3 điểm tạo thành tam giác thì là AB + BC > AC. Việc implement điều kiện này trên code lại phức tạp hơn, vì double có độ chính xác nhất định, nên nếu chỉ dùng toán tử > để diểm tra thì nhiều khi 3 điểm không thẳng hàng nó vẫn ra là thẳng hàng và ngược lại.

    Trích dẫn Nguyên bản được gửi bởi loveboom3012 Xem bài viết
    Mình vẫn còn thấy lờ mờ phần "tính const-correctness", bạn có thể nói rõ hơn chút nữa hok? khi nào mình cần khai báo const , khi nào ko cần khai báo
    Mình đã nói rồi đó:
    -Tham số hàm nào không cần thay đổi thì khai báo const
    -Hàm nào không làm thay đổi *this thì thay báo const
    Ví dụ khai báo const của tham số là: void f(const X& x)
    Ví dụ khai báo const của hàm là: void f() const

    Lấy ví dụ hàm tính khoảng cách giữa điểm *this và điểm u, cả 2 điểm này đều chỉ cần đọc dữ liệu toạ độ chứ không thay đổi, nên cả 2 là const: double kc(const diem& u) const
    Thực ra mình thấy bài ban đầu của bạn đã implement const-correctness 1 cách nửa vời (có 1 số chỗ khai báo const), nên mới nói đến điều này. Còn nếu bạn viết toàn bộ không có chữ const nào thì nó vẫn chạy, và mình cũng sẽ chẳng ý kiến ý cò gì cả >
    Đã được chỉnh sửa lần cuối bởi fbchicken : 20-08-2011 lúc 10:36 AM.

  9. #9
    Ngày gia nhập
    01 2011
    Nơi ở
    -Mountain-
    Bài viết
    768

    Trích dẫn Nguyên bản được gửi bởi fbchicken Xem bài viết
    Bởi vì function hople của bạn luôn trả về 1! Nó kiểm tra AB + BC >= AC, mà điều này luôn đúng với mọi điểm A, B, C
    Mình không hiểu ý nghĩa của hople là gì, nhưng điều kiện để kiểm tra 3 điểm tạo thành tam giác thì là AB + BC > AC. Việc implement điều kiện này trên code lại phức tạp hơn, vì double có độ chính xác nhất định, nên nếu chỉ dùng toán tử > để diểm tra thì nhiều khi 3 điểm không thẳng hàng nó vẫn ra là thẳng hàng và ngược lại.


    Mình đã nói rồi đó:

    Ví dụ khai báo const của tham số là: void f(const X& x)
    Ví dụ khai báo const của hàm là: void f() const

    Lấy ví dụ hàm tính khoảng cách giữa điểm *this và điểm u, cả 2 điểm này đều chỉ cần đọc dữ liệu toạ độ chứ không thay đổi, nên cả 2 là const: double kc(const diem& u) const
    Thực ra mình thấy bài ban đầu của bạn đã implement const-correctness 1 cách nửa vời (có 1 số chỗ khai báo const), nên mới nói đến điều này. Còn nếu bạn viết toàn bộ không có chữ const nào thì nó vẫn chạy, và mình cũng sẽ chẳng ý kiến ý cò gì cả >

    -Hàm nào không làm thay đổi *this thì thay báo const
    Bạn giải thích như trên mình hiểu được chết liền á
    Hướng dẫn C++: https://www.youtube.com/watch?v=BwLodoQdoY4&list=PL1c9Uxlo-mplJDRGdONNupgo5OCBTyGGn

  10. #10
    Ngày gia nhập
    07 2011
    Bài viết
    160

    Trích dẫn Nguyên bản được gửi bởi beautifulsoul84hung Xem bài viết
    Bạn giải thích như trên mình hiểu được chết liền á
    Ý mình là member function của 1 class, có thay đổi bản thân đối tượng đó hay không
    "Bản thân đối tượng đó" mình viết là *this cũng không quá khó hiểu mà

    Ngoài ra còn lỗi typo "khai báo" thế nào mình lại gõ thành "thay báo" .. hic hic sorry
    Ví dụ trong code của chủ thớt:
    hàm (member function) diem::dichuyen(int dx, int dy)
    có thay đổi bản thân đối tượng (tức là thay đổi *this: tăng x 1 khoảng dx, tăng y 1 khoảng dy)
    Vậy thì hàm đó là non-const

    Còn hàm diem::doixung() trả về 1 điểm khác đối xứng với điểm *this, nhưng không thay đổi gì đến *this. Vậy thì hàm đó là const, khai báo là diem diem::doixung() const

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

  1. Trả lời: 5
    Bài viết cuối: 22-11-2012, 11:05 AM
  2. Khắc phục lỗi "Failed to convert parameter value from a String to a Int32"
    Gửi bởi nguyenducbachy trong diễn đàn Nhập môn lập trình C#, ASP.NET
    Trả lời: 3
    Bài viết cuối: 22-08-2012, 10:31 PM
  3. Lỗi "Cannot implicitly convert type..." khi đưa data vào Flex Grid
    Gửi bởi nightmare1111 trong diễn đàn Thắc mắc lập trình C#
    Trả lời: 0
    Bài viết cuối: 11-11-2011, 02:47 PM
  4. Tại sao phát trinh lỗi "Null pointer assignment" và cách khác phục.
    Gửi bởi nguoirung1.6 trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 9
    Bài viết cuối: 24-04-2011, 12:36 AM
  5. Problems : " recover tree " with input as " preorder" and "inorder"
    Gửi bởi HoangManhHa1991 trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 16
    Bài viết cuối: 13-04-2011, 10:19 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