Trang 1 trên tổng số 3 123 Cuối cùngCuối cùng
Từ 1 tới 10 trên tổng số 26 kết quả

Đề tài: lambda GNU và (lại) khai báo const trong hàm

  1. #1
    Ngày gia nhập
    09 2010
    Bài viết
    88

    Mặc định lambda GNU và (lại) khai báo const trong hàm

    mình có các đoạn code sau
    lambda expression
    C++ Code:
    1. #include <iostream>
    2. #include <vector>
    3. #include <stdlib.h>
    4. #include <algorithm>
    5. using namespace std;
    6. int main()
    7. {
    8.     vector<int> vi;
    9.     vi.push_back(1);
    10.     vi.push_back(2);
    11.     int x=2;
    12.     vector<int>::iterator ivi = find_if(vi.begin(), vi.end(), [] (int const &p) { return false; } ); //error ở đây
    13.     if(ivi!=vi.end()) cout<<*ivi; else cout<<"ko thay";
    14.     return 0;
    15. }
    Code:
    no matching function for call to ‘find_if(std::vector<int>::iterator, std::vector<int>::iterator, main()::<lambda(const int&)>)’
    mình không hiểu sai chỗ nào? compile trên VC2010 thì chạy bt. Trên linux g++ 4.7.3 thì bị lỗi này


    và về khai báo const
    C++ Code:
    1. #include <iostream>
    2. using namespace std;
    3. class Ex {
    4. public:
    5.     int _val;
    6.     int *_p_val;
    7.     void setVal(int const &val) {
    8.         _p_val=&val;  //error: error: invalid conversion from ‘const int*’ to ‘int*’
    9.     }
    10.     bool operator==(Ex const &e) const {
    11.         return this->_val== e._val;
    12.     }
    13. };
    14. int main()
    15. {
    16.     Ex x;
    17.     int i=10;
    18.     x.setVal(&i);
    19.     cout<<*x._p_val<<endl;
    20.     return 0;
    21. }
    theo mình hiểu thì khai báo này:
    Code:
    void setVal(int const &val)
    là để không cho phép thay đổi val trong hàm
    không biết cách hiểu của mình khi khai báo const trong hàm như thế có chỗ nào chưa đúng
    mong các bạn giúp đỡ
    thanks
    Đã được chỉnh sửa lần cuối bởi quano1 : 23-08-2013 lúc 09:46 PM.

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

    trên g++-4.7.3 compile có thêm flag -std=c++11 chưa? Code đúng hết rồi chỉ thiếu mỗi flag đó thôi.

  3. #3
    Ngày gia nhập
    09 2010
    Bài viết
    88

    chài cái này mình không hề biết
    nếu thế chắc thêm flag vào là ok rồi
    vậy còn khai báo const. nhờ bạn giúp luôn ^^

    edit: chuẩn luôn. cảm ơn INTP nha
    hỏi thêm câu nữa
    cái lambda expression chỉ có tác dụng duy nhất là giúp mình code nhanh hơn thôi đúng không

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

    sửa member
    int *_p_val;
    của class Ex thành
    const int *_p_val; hay int const *_p_val;

    vì _p_val là con trỏ trỏ tới hằng số nguyên thì phải là const int * hay int const * chứ sao lại chỉ có int * được.

    khi đó thì
    void setVal(int const &val) { _p_val=&val; }
    còn
    void setVal(int const *val) { _p_val=val; }

    cái này ta ghi hơi thừa nhỉ

  5. #5
    Ngày gia nhập
    09 2010
    Bài viết
    88

    đơn giản quá nhỉ :|
    tức là pointer point to const integer
    mình hiểu rồi
    thanks

    p/s: câu hỏi về const vẫn còn đợi mình code demo xong sẽ hỏi luôn
    Đã được chỉnh sửa lần cuối bởi quano1 : 23-08-2013 lúc 09:37 PM.

  6. #6
    Ngày gia nhập
    09 2010
    Bài viết
    88

    Mặc định lambda GNU và (lại) khai báo const trong hàm

    đây: khi mình thêm 1 class như sau:
    C++ Code:
    1. class Exx {
    2. public:
    3.     Ex *_ex;
    4.     void setEx(Ex const &ex)
    5.     {
    6.         _ex=&ex; //error: invalid conversion from ‘const Ex*’ to ‘Ex*’
    7.     }
    8. };

    mục đích là không cho phép thay đổi argument trong thân hàm
    nhưng nếu phải sửa member variable thành
    Code:
    Ex const *ex;
    thì pointer lúc này có vẻ hơi vô dụng bởi nó chỉ được phép trỏ đến Ex const
    có cách nào khắc phục không?

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

    ko. Chỉ có nước bỏ const trong void setEx(Ex const &ex). Vì pass ex kiểu này nếu _ex ko trỏ tới hằng số thì đằng nào ex cũng sẽ bị thay đổi nên ko cần const trong đó đâu.

    có cách khác không ai xài là const_cast:
    _ex = const_cast<Ex*>(&ex);

    cách này thì (tạm) phá cái thuộc tính const của argument ex đi, cũng tương tự như bỏ nó ngay từ đầu rồi. Sau khi gán _ex xong thì *_ex có thể thay đổi nội dung của ex bất kì lúc nào nên Ex const &ex ko có nghĩa lý gì lắm. Bởi vậy nên ko ai xài const_cast

  8. #8
    Ngày gia nhập
    09 2010
    Bài viết
    88

    sự thực thì không hẳn là "vô dụng" nhưng có đôi chỗ không hiểu
    để mình post code hoàn chình lên mọi người cũng xem nhé
    C++ Code:
    1. #include <iostream>
    2. using namespace std;
    3. class Ex;
    4. class Exx;
    5.  
    6. class Ex {
    7. public:
    8.     int _val;
    9.     int const *_p_val;
    10.     void setPtrVal(int * const &val) {
    11.         _p_val=val;
    12.     }
    13. };
    14.  
    15. class Exx {
    16. public:
    17.     Ex const *_ex;
    18.     void setEx(Ex const &ex)
    19.     {
    20.         _ex=&ex;
    21.     }
    22. };
    23.  
    24. int main()
    25. {
    26.     Ex x;
    27.     int i=10;
    28.     x.setPtrVal(&i);
    29.     Exx xx;
    30.     xx.setEx(x);
    31.     int y=20;
    32.     cout<<*(xx._ex->_p_val)<<endl;
    33.     x.setPtrVal(&y);
    34.     cout<<*(xx._ex->_p_val)<<endl;
    35.     cout<<*x._p_val<<endl;
    36.     return 0;
    37. }
    có thể thấy là
    Code:
    Ex const *_ex;
    _ex là 1 pointer chỉ trỏ đến hằng object Ex
    nhưng ở đây
    Code:
    Ex x;
    đâu phải là hằng. tại sao vẫn ok? rắc rối quá :|

  9. #9
    Ngày gia nhập
    09 2010
    Bài viết
    88

    ko. Chỉ có nước bỏ const trong void setEx(Ex const &ex). Vì pass ex kiểu này nếu _ex ko trỏ tới hằng số thì đằng nào ex cũng sẽ bị thay đổi nên ko cần const trong đó đâu.
    nếu vậy, trong C++. khi làm việc nhóm mà 1 người design và 1 người code thì làm thế nào? bởi đơn giản đây chỉ là 1 phép gán.
    giả sử như người ta làm hệ thống quản lý cho ngân hàng chẳng hạn. nếu không xài được const trong function này, và 1 người design, 1 người code. ông code "vô tình" thay đổi biến nào đó để tạo 1 lỗ hổng chẳng may sau này chết đói còn chọc ngoáy vô. trường hợp này mình nghĩ là có chứ đúng không?

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

    void setPtrVal(int * const &val)
    cái này bỏ dấu & đi và đưa const ra trước *

    chuyển implicit (ẩn) từ type Ex thành type const Ex đương nhiên là được. Cứ hiểu là bạn A cho bạn B mượn quyển sách và bảo bạn B đừng ghi bậy bạ gì vào trong đó.

    còn chuyển từ const Ex thành Ex thì có vấn đề. Có thể hình dung là A đưa cho B cái thẻ CMND được ép plastic. B muốn sửa giá trị trên cmnd của A thì phải phá bỏ lớp plastic đó. Vì vậy C++ compiler ko cho phép chuyển ẩn từ const Ex thành Ex mà phải explicit (phải ghi rõ ràng ra) cast bằng const_cast.

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

  1. Cách khai báo const đơn giản
    Gửi bởi trandatnh trong diễn đàn Thủ thuật, Tutorials và Mã nguồn C/C++/C++0x
    Trả lời: 0
    Bài viết cuối: 05-09-2013, 10:51 AM
  2. Lập trình C++0x const: ý nghĩa của const trong khai báo function
    Gửi bởi quano1 trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 13
    Bài viết cuối: 06-08-2013, 07:24 AM
  3. CONST trong khai báo hàm của class sentence có nghĩa là gì?
    Gửi bởi oxfordthuongyeu 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: 20-05-2011, 09:57 AM
  4. Kỹ thuật C Khai báo const trong lập trình C?
    Gửi bởi icanfeel trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 3
    Bài viết cuối: 17-11-2010, 10:19 PM
  5. const A* const method(const A* const) const;//const thứ 2
    Gửi bởi david8xvn trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 18
    Bài viết cuối: 23-09-2010, 12:36 AM

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