我正在尝试创建自己的std :: string包装器来扩展其功能。 但是在声明<<<<<<<<<运营商。 到目前为止,这是我的代码:
我的自定义字符串类:
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;
任何形式的帮助都将不胜感激!
感谢。
只是fyi:我的IDE是Microsoft Visual C ++ 2008 Express Edition。
答案 0 :(得分:6)
如果你看一下所有流操作符的声明方式,它们的格式如下:
ostream& operator<<(ostream& out, const someType& val );
基本上,您希望重载函数实际执行输出操作,然后返回新更新的流操作符。我建议做的是以下内容,请注意这是一个全局函数,而不是您的类的成员:
ostream& operator<< (ostream& out, const MyCustomString& str )
{
return out << str.data;
}
请注意,如果您的“数据”对象是私有的,可能应该使用哪个基本OOP,则可以在内部将上述运算符声明为“朋友”函数。这将允许它访问私有数据变量。
答案 1 :(得分:3)
你需要一个独立的功能(你班上的朋友,如果你让你的data
私密,你可能应该这样做!)
inline std::ostream & operator<<(std::ostream &o, const MyCustomString&& d)
{
return o << d.data;
}
答案 2 :(得分:2)
首先,您似乎遇到了MyCustomString定义的问题。它从std::string
私下继承,并包含std::string
本身的实例。我会删除其中一个。
假设您正在实现一个新的字符串类,并且希望能够使用std::cout
输出它,您需要一个强制转换运算符来返回std::cout
期望的字符串数据:
operator const char *()
{
return this->data.c_str();
}
答案 3 :(得分:1)
这不是你如何重载&lt;&lt;运营商。您需要传入对ostream的引用并返回一个(因此您可以堆叠多个&lt;&lt;&lt;&lt;,如std::cout << lol << lol2
)。
ostream& operator << (ostream& os, const MyCustomString& s);
然后就这样做:
ostream& operator << (ostream& os, const MyCustomString& s)
{
return os << s.data;
}