2010-07-17 42 views
9

Chức năng của bạn bè sẽ có thể truy cập vào một thành viên riêng tư trong lớp học phải không? Vậy tôi đã làm gì sai ở đây? Tôi đã đính kèm tệp .h của mình với nhà điều hành < < Tôi có ý định kết bạn với lớp học.bạn bè có lớp học nhưng không thể truy cập thành viên riêng

#include <iostream> 

using namespace std; 
class fun 
{ 
private: 
    int a; 
    int b; 
    int c; 


public: 
    fun(int a, int b); 
    void my_swap(); 
    int a_func(); 
    void print(); 

    friend ostream& operator<<(ostream& out, const fun& fun); 
}; 

ostream& operator<<(ostream& out, fun& fun) 
{ 
    out << "a= " << fun.a << ", b= " << fun.b << std::endl; 

    return out; 
} 

Trả lời

12

Tại đây ...

ostream& operator<<(ostream& out, fun& fun) 
{ 
    out << "a= " << fun.a << ", b= " << fun.b << std::endl; 

    return out; 
} 

bạn cần

ostream& operator<<(ostream& out, const fun& fun) 
{ 
    out << "a= " << fun.a << ", b= " << fun.b << std::endl; 

    return out; 
} 

(Tôi đã cắn vào bum bởi nhiều lần này; định nghĩa về tình trạng quá tải nhà điều hành của bạn không' t khá khớp với tuyên bố, vì vậy nó được cho là một chức năng khác.)

+2

đó thật buồn cười như thế nào là điều đơn giản nhất nhất là hầu hết các khó khăn nhất để tìm ... – starcorn

+0

Liệu 'vui vẻ &' luôn luôn phải là 'const'? – peter

5

Chữ ký không khớp. Chức năng không phải thành viên của bạn vui vẻ & vui vẻ, người bạn tuyên bố trên mất niềm vui vui vẻ & thú vị.

0

Bạn có thể tránh các loại lỗi bằng cách viết định nghĩa các hàm bạn bè bên trong định nghĩa lớp:

class fun 
{ 
    //... 

    friend ostream& operator<<(ostream& out, const fun& f) 
    { 
     out << "a= " << f.a << ", b= " << f.b << std::endl; 
     return out; 
    } 
}; 

Nhược điểm là mỗi cuộc gọi đến operator<< được sắp xếp theo hàng mà có thể dẫn đến sưng lên code.

(Cũng lưu ý rằng các thông số không thể được gọi fun vì tên đó đã biểu thị một loại.)

Các vấn đề liên quan