代码之家  ›  专栏  ›  技术社区  ›  J. Polfer

使用运算符从对象分配std::string=

  •  1
  • J. Polfer  · 技术社区  · 14 年前

    std::string 对象来自 DecoratedString 我正在写的东西。

    class DecoratedString
    {
    private:
        std::string m_String;
    public:
         DecoratedString(const std::string& initvalue)
         : m_String(initvalue)
         {
         }
    
         const std::string& ToString() const
         {
             return m_String;
         }
    
         const std::string& operator=(const DecoratedString& rhs)
         {
             return rhs.ToString();
         }
    
    }
    

    我已经编写了一个单元测试来确保这一点:

    void DecoratedStringTest::testAssignmentToString()
    {
        std::string expected("test");
        DecoratedString sut(expected);
        std::string actual;
        actual = sut;
    
        CPPUNIT_ASSERT_EQUAL(actual, sut.ToString());
    }
    

    然而,编译人员说 error: no match for 'operator=' in 'actual = sut' . 然后列出标准库中的重载操作符=选项。

    为什么编译器找不到 operator= 我定义了什么?

    编辑:

    转换 接线员,不是 接线员。非常感谢那些看到我尝试做什么并解释我应该做什么的人。

    4 回复  |  直到 14 年前
        1
  •  2
  •   SoapBox    14 年前

    您需要的是一个成员“conversion operator”,它可以在需要时自动将修饰字符串转换为std::string,如下所示:

    operator std::string const &() const { return ToString(); }
    

    std::string const & 每当需要时(例如,与std::string比较时,或将DecoratedString传递给采用 ).

        2
  •  1
  •   jamesdlin    14 年前

    编译器正在抱怨这一行:

    actual = sut;
    

    应该是:

    actual = sut.ToString();
    

    或者,您应该提供一个cast操作符来隐式地转换 DecoratedString std::string

    class DecoratedString
    {
        ...
        operator std::string() const
        {
            return ToString();
        }
    };
    
        3
  •  1
  •   Timo Geusch    14 年前

    您正在重载一元赋值运算符,该运算符用于将特定类型赋值给 DecoratedString 并且应该返回对 装饰字符串 所以你可以把任务链起来。此运算符不允许您指定的对象 装饰字符串 到另一个数据类型,但是您可以分配一个不一定是 装饰字符串 装饰字符串 . 它还提供了一个定义良好的函数来处理类的赋值可能需要的任何类型的特定处理(例如,deep copy)。

    你要么给你的朋友打电话 ToString() 函数,否则您必须创建一个转换运算符来转换 装饰字符串 变成一个 std::string 装饰字符串 :

    operator std::string () const;
    

    另一方面,您的运算符重载不工作的另一个原因是,您试图通过返回值来重载函数,这在C++中是个大的“否”。

        4
  •  1
  •   Nikolai Fetissov    14 年前

    你倒过来了。这个 operator= std::string 为了能够接受您的对象,不是您从中分配的类,而是因为您正在处理 标准库 你不能那样做。

    std::string& operator<<( std::string& out, const your_class& yc )
    {
        out.assign( yc.to_string());
        return out;
    }
    
    your_class myobj;
    std::string str;
    str << myobj;
    

    或者只是为 std::ostream std::stringstream .

    类型转换运算符 :

    your_class::operator const std::string() const;