首页 文章

返回C中自定义字符串类的<<运算符函数的值

提问于
浏览
2

我正在尝试创建自己的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 .

4 回答

  • 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,则可以在内部将上述运算符声明为“朋友”函数 . 这将允许它访问私有数据变量 .

  • 1

    你需要一个独立的功能(你班上的朋友,如果你让你的 data 私有你应该!)

    inline std::ostream & operator<<(std::ostream &o, const MyCustomString&& d)
    {
        return o << d.data;
    }
    
  • 2

    这不是你重载<<运算符的方式 . 您需要传入对ostream的引用并返回一个(因此您可以堆叠多个<<,如 std::cout << lol << lol2 ) .

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

    然后就这样做:

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

相关问题