Từ 1 tới 10 trên tổng số 10 kết quả

Đề tài: Hàm bạn và lớp bạn

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

    Mặc định Hàm bạn và lớp bạn

    Em đang học C++ về hàm bạn và lớp bạn. Sách của em họ viết ít quá chỉ có một vài ví dụ nhỏ mà kiến thức thì ít. Em nghe bảo là cái này rất quan trọng nên em muốn tìm hiểu hơn. Vậy các anh chị có thể chỉ bảo cho em được không ạ. Các anh chị có thể nói cho em về tác dụng của hàm bạn và cho em một ví dụ dễ hiểu được không ạ. Em xin chân thành cám ơn các anh chị.
    Đã được chỉnh sửa lần cuối bởi thom_it : 06-04-2008 lúc 02:40 PM.

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

    Các anh chị ơi làm ơn cho em hỏi được không ạ. Em có một ví dụ về việc so sánh tốc độ của hai chiếc ô tô. Ở đây hàm int sosanh() của lớp oto_con làm bạn với lớp oto_tai.
    C++ Code:
    1. #include<iotream.h>
    2. #include<conio.h>
    3. class oto_tai;      // Tại sao lại phải có câu lệnh này ạ. Tại sao mình không khai báo và tạo lập lớp oto_tai ở đây luôn mà lại chỉ khải báo thôi ạ.
    4. class oto_con {
    5.                 int songuoi, tocdo;
    6. public:
    7.                 oto_con(int n, int t) {songuoi=n; tocdo=t;}
    8.                 int do_tocdo() {return tocdo;}
    9.                 int sosanh(oto_tai);//Hàm này sẽ là hàm bạn của lớp oto_tai
    10. };
    11. class oto_tai {
    12.                 int trongluong,tocdo;
    13. public:
    14.                 oto_tai(int tl,int t) {trongluong=tl; tocdo=t;}
    15. friend int oto_con::sosanh(oto_tai t);
    16. };
    Các anh chị làm ơn giải thích giùm em với nha. Em chân thành cám ơn rất nhiều ạ.

    Vui lòng chú ý để code trong tag code. Đọc Nội quy để biết thêm chi tiết
    Đã được chỉnh sửa lần cuối bởi Kevin Hoang : 07-04-2008 lúc 02:12 AM. Lý do: Nhắc nhở hoài

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

    C++ Code:
    1. #include <iostream>
    2.  
    3. class xe_oto{
    4.  int so_nguoi;
    5.  int toc_do;
    6. public :
    7.   xe_oto(int sn, int td):so_nguoi(sn), toc_do(td){
    8.   }
    9.  friend bool so_sanh_toc_do(const xe_oto& lhs, const xe_oto& rhs){
    10.     return (lhs.toc_do > rhs.toc_do);
    11.  }
    12. };
    13.  
    14. int main(){
    15.   xe_oto BMW(13, 214);
    16.   xe_oto HONDA(12, 250);
    17.  
    18.   if(so_sanh_toc_do(BMW, HONDA))
    19.     std::cout << "BMW is faster";
    20.   else
    21.     std::cout << "HONDA is faster";
    22.  
    23.   return 0;
    24. }
    - khai báo friend để nó có thể gọi mà không cần đối tượng.
    - friend là 1 dạng standalone function.
    - Nếu cậu bỏ friend khi cậu gọi so sánh bắt buộc cậu phải có 1 đối tượng gọi ví dụ :
    C++ Code:
    1.   xe_oto nguoi_so_sanh;
    2.   nguoi_so_sanh.so_sanh_toc_do(BMW, HONDA);

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

    Vâng em biết rồi ạ. Nhưng em muốn hỏi cái đoạn này:
    class oto_tai; // Tại sao lại phải có câu lệnh này ạ. Tại sao mình không khai báo và tạo lập lớp oto_tai ở đây luôn mà lại chỉ khải báo thôi ạ.
    class oto_con { .....};
    và anh ơi cho em hỏi thêm là friend bool là cái gì thế ạ. Anh giải thích giùm em với nha. Em cám ơn anh nhiều.

  5. #5
    Ngày gia nhập
    12 2007
    Bài viết
    224

    class oto_tai; // Tại sao lại phải có câu lệnh này ạ. Tại sao mình không khai báo và tạo lập lớp oto_tai ở đây luôn mà lại chỉ khải báo thôi ạ.
    Do trong lớp oto_con của bạn có dùng lớp oto_tai trước khi định nghĩa nó nên bạn bắt buộc phải khai báo lớp oto_tai cho trình biên dịch biết .

    #include<iotream.h>
    #include<conio.h>
    class oto_tai; // Tại sao lại phải có câu lệnh này ạ. Tại sao mình không khai báo và tạo lập lớp oto_tai ở đây luôn mà lại chỉ khải báo thôi ạ.
    class oto_con {
    int songuoi, tocdo;
    public:
    oto_con(int n, int t) {songuoi=n; tocdo=t;}
    int do_tocdo() {return tocdo;}
    int sosanh(oto_tai);//p day ban dung lop oto_tai ne , thay chua , neu ko khai bao truoc thi lam sao tbd hieu ban dang dung cai gi ...
    };
    class oto_tai {
    int trongluong,tocdo;
    public:
    oto_tai(int tl,int t) {trongluong=tl; tocdo=t;}
    friend int oto_con::sosanh(oto_tai t);
    };

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

    Mặc định Hàm bạn và lớp bạn

    Vâng em biết rồi ạ. Nhưng em muốn hỏi cái đoạn này:
    class oto_tai; // Tại sao lại phải có câu lệnh này ạ. Tại sao mình không khai báo và tạo lập lớp oto_tai ở đây luôn mà lại chỉ khải báo thôi ạ.
    class oto_con { .....};
    và anh ơi cho em hỏi thêm là friend bool là cái gì thế ạ. Anh giải thích giùm em với nha. Em cám ơn anh nhiều.
    - bool là trả về true or false, code này của cậu là very messy. 2 class không hề có relation mà để friend reuse lại cái hàm so sánh làm gì ?
    - Cậu để ý viết bài hỏi rồi lại sữa lại thì tui không biết đường đâu mà mò, nếu muốn hỏi câu hỏi khác : post.
    - Trường hợp của cậu muốn dùng thì cho thằng tạo cho nó 1 namespace và cho nó vào, code sẽ rõ ràng hơn.
    - Đây là 1 cách design tốt hơn :
    C++ Code:
    1. #include <iostream>
    2.  
    3. class xe_oto{
    4.  int so_nguoi;
    5.  int toc_do;
    6. public :
    7.   xe_oto(int sn, int td):so_nguoi(sn), toc_do(td){
    8.   }
    9.   int get_toc_do() const{
    10.     return toc_do;
    11.   }
    12. };
    13.  
    14. class xe_tai{
    15.  int trong_luong;
    16.  int toc_do;
    17. public :
    18.   xe_tai(int tl, int td):trong_luong(tl), toc_do(td){
    19.   }
    20.   int get_toc_do() const{
    21.     return toc_do;
    22.   }
    23. };
    24.  
    25. namespace vv{
    26.   static bool so_sanh_toc_do(const xe_tai& lhs, const xe_oto& rhs){
    27.     return (lhs.get_toc_do() > rhs.get_toc_do());
    28.   }
    29. }
    30.  
    31. int main(){
    32.   xe_oto BMW(13, 214);
    33.   xe_tai HONDA(12, 250);
    34.  
    35.   if(vv::so_sanh_toc_do(HONDA, BMW))
    36.     std::cout << "BMW is faster";
    37.   else
    38.     std::cout << "HONDA is faster";
    39.  
    40.   return 0;
    41. }

  7. #7
    Ngày gia nhập
    11 2007
    Nơi ở
    Biết để làm gì?
    Bài viết
    827

    Khai báo class oto_tai; mà không làm gì giống như là khai báo nguyên mẫu cho hàm thôi.Còn hàm bạn(friend function) có thể truy cập tới các phương thức của class.Nó không phải là phương thức của lớp và không có đối ẩn ứng với con trỏ this
    Cánh Chym ứ mỏi

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

    Em chào các anh chị. Em lại có câu hỏi nữa đây ạ. Em thấy trong sách nói là có nhiều kiểu bạn bè:
    - Hàm tự do là hàm bạn của một lớp.
    - Phương thức của một lớp là bạn của một lớp khác.
    - ..........
    Em muốn hỏi là hàm tự do là gì ạ? Và em thấy hai kiểu bạn bè ở trên có khác gì nhau không ạ. Em thấy nó như nhau. Vì phương thức của một lớp cũng là một hàm, nó là hàm bạn của một lớp khác thì cũng giống như nó là một hàm tự do là hàm bạn của lớp đó. Em nghĩ thế có đúng không ạ?

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

    Trích dẫn Nguyên bản được gửi bởi thom_it Xem bài viết
    và anh ơi cho em hỏi thêm là friend bool là cái gì thế ạ. Anh giải thích giùm em với nha. Em cám ơn anh nhiều.
    bool là một kiểu chỉ trả về true hoặc false, friend bool tên hàm() thì chẳng qua nó là một hàm có kiểu bool là friend của lớp đó, tức là hàm đó có thể sử dụng mọi phương thức và các thuộc tính của lớp đó thế thôi.
    Chú ý với rox nhá: khi trả lời với newbie không nên quá cao siêu (vì như vậy họ sẽ chẳng hiểu cái gì cả) mà hãy tập chung giải thích những gì họ hỏi còn muốn sửa code hay upgrade code họ lên thì để sau nhé

    Trích dẫn Nguyên bản được gửi bởi thom_it Xem bài viết
    Em chào các anh chị. Em lại có câu hỏi nữa đây ạ. Em thấy trong sách nói là có nhiều kiểu bạn bè:
    - Hàm tự do là hàm bạn của một lớp.
    - Phương thức của một lớp là bạn của một lớp khác.
    - ..........
    Em muốn hỏi là hàm tự do là gì ạ? Và em thấy hai kiểu bạn bè ở trên có khác gì nhau không ạ. Em thấy nó như nhau. Vì phương thức của một lớp cũng là một hàm, nó là hàm bạn của một lớp khác thì cũng giống như nó là một hàm tự do là hàm bạn của lớp đó. Em nghĩ thế có đúng không ạ?
    - Hàm tự do là hàm bạn của lớp khác là một hàm tự do có thể sử dụng phương thức hay thuộc tính của lớp đó, và hàm đó nó không phải là một thuộc tính của một lớp nào hết.
    - Còn phương thức của một lớp A (chú ý nó không phải là một hàm mà là một phương thức của lớp đó tức là nó có tác dụng để định nghĩa lớp thôi mặc dù nó giống hàm đấy) là hàm bạn của lớp B thì đơn giản là phương thức của lớp A có thể sử dụng các thuộc tính hay phương thức của lớp B một cách thoải mái (kể cả thuộc tính hay phương thức của lớp B để trong private hay protected).

    Ngôn ngữ C++ là một ngôn ngữ lai (hybrid) nên nó không thể hiện rõ sự hướng đối tượng (OOP Object-Oriented Programming). Nếu bạn muốn tìm hiểu rõ về OOP hãy chọn những ngôn ngữ thuần hướng đối tượng như Java hay C# sẽ dễ dàng hơn

    Mà anh chị cái gì nghe khách sáo quá
    Đã được chỉnh sửa lần cuối bởi Counter-Strike : 08-04-2008 lúc 07:50 AM.

  10. #10
    Ngày gia nhập
    11 2007
    Nơi ở
    Biết để làm gì?
    Bài viết
    827

    Trích dẫn Nguyên bản được gửi bởi Counter-Strike Xem bài viết
    - Hàm tự do là hàm bạn của lớp khác là một hàm tự do có thể sử dụng phương thức hay thuộc tính của lớp đó, và hàm đó nó không phải là một thuộc tính của một lớp nào hết.
    Hình như bạn giải thích sai rồi,hàm tự do thì không thể truy cập đến thuộc tính private của 1 class.
    PHP Code:
    #include <iostream.h>
    class A
    {
    private:
        
    int a,b;
    public:
        
    A(int a,int b)
        {
            
    this->a=a;
            
    this->b=b;
        }
    };
    A cong(A a1,A a2)
    {
        
    A x;
        
    x.a=a1.a+a2.b;
        
    x.b=a1.b+a1.b;
        return 
    x;

    thì
    PHP Code:
    A cong(A a1,A a2
    là hàm tự do,nhựng code này sẽ báo lỗi :"cannot access private member declared in class 'A' ".Như vậy làm gì có chuyện hàm tự do là hàm bạn của 1 class.Cái này chưa gặp bao giờ,thom_it có thể cho code ví dụ được không?
    Cánh Chym ứ mỏi

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