2011-11-10 12 views
9

Làm thế nào người ta có thể quá tải một nhà điều hành < < cho một lớp riêng tư lồng nhau như thế này?Toán tử quá tải << cho một lớp riêng lồng nhau có thể?

class outer { 
    private: 
    class nested { 
     friend ostream& operator<<(ostream& os, const nested& a); 
    }; 
    // ... 
}; 

Khi cố gắng bên ngoài của trình biên dịch lớp bên ngoài than phiền về sự riêng tư:

error: ‘class outer::nested’ is private 

Trả lời

13

Bạn có thể làm cho operator<< một người bạn của outer là tốt. Hoặc bạn có thể thực hiện nó hoàn toàn inline trong nested, ví dụ:

class Outer 
{ 
    class Inner 
    { 
     friend std::ostream& 
     operator<<(std::ostream& dest, Inner const& obj) 
     { 
      obj.print(dest); 
      return dest; 
     } 
     // ... 
     // don't forget to define print (which needn't be inline) 
    }; 
    // ... 
}; 
+0

và thứ chức năng in e phải là hàm thành viên 'const'. Nếu nó là 'std :: ostream & print (std :: ostream & out) const', thì toán tử' 'có thể chỉ là một dòng:' return obj.print (dest); '. – Nawaz

+0

Tại sao std: ostream cần phải là bạn của Inner? – Mordachai

+1

Bởi vì bạn không thể xác định nó trong 'Bên trong 'ngược lại. (Và nếu nó không được định nghĩa trong 'Inner', bạn có vấn đề là nó không thể truy cập' Inner', bởi vì 'Inner' là một thành viên riêng của' Outer'.) –

6

nếu bạn muốn điều tương tự trong hai tập tin khác nhau (hh, cpp), bạn có cho bạn bè hai thời gian chức năng như sau:

hh:

// file.hh 
class Outer 
{ 
    class Inner 
    { 
     friend std::ostream& operator<<(std::ostream& dest, Inner const& obj); 
     // ... 
    }; 

    friend std::ostream& operator<<(std::ostream& dest, Outer::Inner const& obj); 
    // ... 
}; 

cpp:

// file.cpp: 
#include "file.hh" 

std::ostream &operator<<(std::ostream& dest, Outer::Inner const& obj) 
{ 
    return dest; 
}