2009-08-09 22 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; 
} 
相关问题