2010-03-23 38 views
5

Tôi nhận được lỗi sau khi tôi cố gắng truy cập vào thùng thành viên private của lớp GHistogram từ bên trong việc thực hiện extractHistogram():Tại sao chức năng bạn bè này không thể truy cập thành viên riêng tư của lớp học?

error: 'QVector<double> MyNamespace::GHistogram::bins' is private 
error: within this context 

Trường hợp 'trong bối cảnh này' lỗi điểm để thực hiện extractHistogram(). Có ai biết những gì sai với khai báo chức năng bạn bè của tôi?

Dưới đây là các mã:

namespace MyNamespace{ 

class GHistogram 
{ 

public: 
    GHistogram(qint32 numberOfBins); 
    qint32 getNumberOfBins(); 

    /** 
    * Returns the frequency of the value i. 
    */ 
    double getValueAt(qint32 i); 
    friend GHistogram * MyNamespace::extractHistogram(GImage *image, 
                 qint32 numberOfBins); 

private: 
    QVector<double> bins; 
}; 

GHistogram * extractHistogram(GImage * image, 
           qint32 numberOfBins); 

} // End of MyNamespace 
+2

là 'Gbdi' một lớp hoặc namespace? Bạn có 'Gbdi :: extractHistogram' là bạn. – quamrana

+0

Xin lỗi, hãy thay thế Gbdi bằng MyNamespace. GBDI là tên nhóm nghiên cứu nơi tôi làm việc ... –

Trả lời

5

Theo GCC tôi mã trên không biên dịch vì việc kê khai của extractHistogram() xuất hiện sau khi định nghĩa lớp, trong đó nó là friend ed. Trình biên dịch chokes trên báo cáo friend, nói rằng extractHistogram không phải là một hàm hay thành viên dữ liệu. Tất cả hoạt động tốt và bins có thể truy cập được khi tôi di chuyển khai báo trước định nghĩa lớp (và thêm một khai báo chuyển tiếp class GHistogram; để kiểu trả về được biết đến trình biên dịch). Tất nhiên các mã cho extractHistogram() nên được viết bên trong namespace, hoặc bằng cách

namesapce MyNameSpace { 
// write the function here 
} 

hoặc

GHistogram *MyNameSpace::extractHistogram(//.... 
+0

Cảm ơn bạn! Tôi đã cố gắng khai báo extractHistogram() trước khi khai báo lớp, nhưng nó không hoạt động vì nó thiếu phạm vi không gian tên trong triển khai hàm - tôi nghĩ rằng tôi chỉ phải sử dụng mệnh đề 'using namespace' ... –

1

Bạn khai báo Gbdi::extractHistogram trở thành một người bạn để GHistogram, nhưng bạn khai báo một chức năng tên extractHistogram và hy vọng nó cho bạn bè với GHistogram. extractHistogram phải là thành viên của Gbdi.

+0

Xin lỗi vì lỗi của tôi. Chính xác là MyNamespace thay vì Gbdi trong mã. –

2

Hãy thử chỉ:

friend GHistogram *extractHistogram(GImage *image, qint32 numberOfBins); 
+0

Xin lỗi vì lỗi của tôi. Chính xác là MyNamespace thay vì mã Gbdi int he. Khi tôi loại bỏ MyNamespace, tôi nhận được cùng một lỗi. –

1

Tôi đoán bạn có nghĩa là:

friend GHistogram * extractHistogram(GImage *image, qint32 numberOfBins); 

Đây có lẽ không phải là lý do mà một gợi ý:

hơn Một điều, bạn không cần khai báo một hàm trong một lớp nếu nó là bạn của lớp đó và bạn đã khai báo nó trong lớp.

Nói cách khác:

//Your.h 
class Foo 
{ 
friend void m(); 
} 
void m(); //This is totally unnecessary 

//Your.cpp 
void m() 
{ 
} 
+0

Nhưng nếu tôi làm điều đó, khi tôi cố gắng gọi m() từ, nói int main() trong 'main.cpp' tôi sẽ nhận được một lỗi cho tôi biết rằng 'm() không được khai báo trong phạm vi này' ngay cả khi Tôi bao gồm 'Your.h' trong 'main.cpp' của tôi. –

+0

Bạn hoàn toàn đúng. Nó trượt tâm trí của tôi bởi vì tôi thường không làm điều đó. Tôi sẽ xóa nó. Lấy làm tiếc. – Anzurio

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