2009-07-29 84 views
5

我有一個使用一個結構,我想超載< <操作爲結構,但只在類的類:超負荷運營商<<在C++類中的

typedef struct my_struct_t { 
    int a; 
    char c; 
} my_struct; 

class My_Class 
{ 
    public: 
    My_Class(); 
    friend ostream& operator<< (ostream& os, my_struct m); 
} 

我只能當我聲明運算符< <重載w/friend關鍵字時編譯,但然後運算符在我的代碼中的任何地方超載,而不僅僅是在類中。如何僅在類中爲my_struct重載< <運算符?

編輯:我將要使用重載運算符來打印這是My_Class

+2

但是,當你用`my_struct`調用`operator <<`時,它只會被重載,所以不好嗎? – 2009-07-29 14:02:38

+3

請注意,'typedef結構'成語在C++中並非真正必需:http://stackoverflow.com/questions/612328/difference-between-struct-and-typedef-struct-in-c – 2009-07-29 14:09:33

回答

9

如何重載< <運營商my_struct只有類中?

把它定義爲

static std::ostream & operator<<(std::ostream & o, const my_struct & s) { //... 

namespace { 
    std::ostream & operator<<(std::ostream & o, const my_struct & s) { //... 
} 

在您實現MyClass.cpp文件。

編輯:如果你真的,真的需要範圍上的類,沒有別的,然後定義它作爲一個私人靜態函數在上課。它只會在該類的範圍內,並且是子類。它會隱藏爲無關類定義的所有其他自定義operator<<,儘管(除此之外,只在類內部,它是子類),除非它們可以在ADL中找到,或者已經是std::ostream的成員。

10

成員不要使用運營商< <一個my_struct。使用一個指定的成員函數,並將其設爲私有。

class My_Class 
{ 
    public: 
    My_Class(); 
private: 
    void Print(ostream & os, const my_struct & m); 
}; 

請注意,您應該傳遞結構作爲const引用,無論您使用哪種方法。

編輯:沒有必要使運營商< <類中的一員,所以您可以用它來打印類的成員。你可以使它成爲結構的一個朋友,或者一個完全自由的函數,然後這個類被使用。

1

如果通過「僅在My_Class中重載」,您的意思是隻有我的類可見/可用,則可以使用僅對My_Class可見的非成員重載。例如。

struct my_struct { 
     int a; 
     char c; 
    }; 

    class My_Class 
    { 
     publiC: 
     My_Class(); 
    } 
在My_Class.cpp

然後:

namespace { 
    ostream& operator(ostream& os, const my_struct& mystruct) { 
     os << mystruct.a << mystruct.c; 
    } 
} 
+0

爲什麼要刪除&取消回答說同樣的事情? – 2009-07-29 14:22:16