2009-08-09 26 views
2

我想創建自己的std :: string包裝來擴展它的功能。 但是在聲明< <運算符時遇到了問題。 這裏是我到目前爲止的代碼:在C++中自定義字符串類的<<運算符函數的返回值

我的自定義字符串類:

class MyCustomString : private std::string 
{ 
public: 
    std::string data; 
    MyCustomString() { data.assign(""); } 
    MyCustomString(char *value) { data.assign(value); } 
    void Assign(char *value) { data.assign(value); } 
    // ...other useful functions 
    std::string & operator << (const MyCustomString &src) { return this->data; } 
};

主程序:

int main() 
{ 
    MyCustomString mystring("Hello"); 
    std::cout << mystring; // error C2243: 'type cast' : conversion from 'MyCustomString *' to 'const std::basic_string<_Elem,_Traits,_Ax> &' exists, but is inaccessible 

    return 0; 
}

我想COUT治療類作爲的std :: string,使我不需要這樣做:

std::cout << mystring.data;

任何形式的幫助,將不勝感激!

謝謝。

Just fyi:我的IDE是Microsoft Visual C++ 2008 Express Edition。

+0

我加入到這裏的其他答案,你需要一個獨立的(全局函數)的原因是因爲第一個參數的類型需要是一個'std :: string'或者你想在'<<'運算符之前擁有的任何類型。 – Skurmedel 2009-08-09 03:22:26

+0

...這是在不修改實際的std :: string類的情況下提供這樣的運算符的唯一方法。 – Skurmedel 2009-08-09 03:23:21

回答

1

首先,您似乎遇到了MyCustomString的定義問題。它從std::string私下繼承,並且包含std::string本身的一個實例。我會刪除一個或另一個。

假設你正在實施一個新的字符串類,並要能夠輸出它使用std::cout,你需要一個轉換運算符返回其std::cout預計字符串數據:

operator const char *() 
{ 
    return this->data.c_str(); 
} 
4

如果你看一下所有的流運營商是如何宣稱他們的形式是:

ostream& operator<<(ostream& out, const someType& val); 

從本質上講,你希望你的重載函數實際做的輸出,然後再返回新的更新流運算符。我建議做如下,注意,這是一個全球性的功能,而不是你的類的成員:

ostream& operator<< (ostream& out, const MyCustomString& str) 
{ 
    return out << str.data; 
} 

需要注意的是,如果你的「數據」對象是私人的,其基本的OOP說,這也許應該,您可以在內部聲明上述運算符爲「朋友」函數。這將允許它訪問私有數據變量。

+0

好點。或者他可以使用訪問器函數。 – jkeys 2009-08-09 03:13:06

1

這不是你如何超載運算符。你需要傳遞一個對ostream的引用並返回一個(所以你可以堆棧多個< <,比如std::cout << lol << lol2)。

ostream& operator << (ostream& os, const MyCustomString& s); 

然後只是這樣做:

ostream& operator << (ostream& os, const MyCustomString& s) 
{ 
    return os << s.data; 
} 
2

你需要一個獨立的功能(你的類的朋友,如果你讓你data私人或許你應該!)

inline std::ostream & operator<<(std::ostream &o, const MyCustomString&& d) 
{ 
    return o << d.data; 
} 
相關問題