【问题标题】:C++ Operator overloading: assign A's attribute value of type B to a B objectC++运算符重载:将A的B类型属性值赋给B对象
【发布时间】:2016-03-08 18:58:53
【问题描述】:

std::string 类允许在 this 运算符的帮助下从不同的类型分配其内部值,例如 'char'、'const char*' 和 'std::string'。需要重载哪个算子才能达到以下效果?

class A {
public:
    A(std::string value)
        : m_value(value)
    {
    }

    // A a = std::string("some value")
    A& operator=(const std::string value) {
        m_value = value;
    }

    // std::string someValue = A("blabla")
    ???? operator ????

private:
    std::string m_value;
};

之后,我们应该可以通过A对象访问std::string的函数了,例如:

A a("foo");

printf("A's value: %s \n", a.c_str());

【问题讨论】:

  • 与您的问题无关,但m_value = value; 应该是m_value = std::move(value);,而value 应该是非常量。构造函数也是如此
  • @M.M 为什么要在这种情况下使用 std::move()?
  • 这样value持有的资源就可以转移到m_value,而不是复制然后销毁旧资源。

标签: c++ operator-overloading


【解决方案1】:

您需要使class A 能够将自己转换为string 类型。

这看起来像:

class A
{
public:
    operator std::string() const { return m_value; }
};

之后,您可以这样做:

printf("A's value: %s \n", ((std::string)a).c_str());

或者,您可以重载-> 运算符:

class A
{
public:
    const std::string* operator->()const { return & m_value; }
}

printf("A's value: %s \n", a->c_str());

IDEOne link

【讨论】:

  • 这几乎正是我正在寻找的。我知道“运算符 std::string”(顺便说一下,这个运算符的名称是什么?)但是将其转换为 std::string 真的很奇怪。 “->” 运算符几乎可以满足我的真正需要。是否可以覆盖“。”运算符(这是哪一个?)以便我们可以执行“a.c_str()”并且不会使用/返回指针?
猜你喜欢
  • 2015-11-14
  • 2012-09-03
  • 1970-01-01
  • 2021-03-14
  • 2017-05-16
  • 2021-08-25
  • 2011-03-28
  • 2017-12-21
  • 2015-09-03
相关资源
最近更新 更多