【问题标题】:C++ operator overloading [], where is the data parameter to assign?C++运算符重载[],要赋值的数据参数在哪里?
【发布时间】:2019-04-25 07:12:20
【问题描述】:

我想在我的类中添加一个重载运算符 []。运算符重载不是我以前必须做的事情。

我想编写一个实现来执行以下操作:

    myclass a;
    a["test"] = 123;
    int test = a["test"];      

到目前为止,在我的课堂上,原型看起来是这样的:

    string operator[](const char* cpszLabel);

实现不完整,如下所示:

    string myclass::operator[](const char* cpszLabel) {
        string strContent;
        if ( cpszLabel != nullptr ) {
        }
        return strContent;
    }

我不确定如何引用正在分配的数据,或者这是否也需要重载“=”?

我为 '=' 运算符添加了一个重载,但它没有被调用:

原型:

    string operator=(int intData);

实施:

    string myclass::operator=(int intData) {
        char szString[24];
        sprintf(szString, "\"%d\"", intData);
        return string(szString);
    }

【问题讨论】:

标签: c++ operator-overloading


【解决方案1】:

你需要安排一些事情,所以operator[](const char* cpszLabel) 会返回一个引用到你班级中的某个东西。

int& operator[](const char* cpszLabel);

可能是一个更好的原型。

然后,您可以通过该引用修改您班级中的“某事”。老实说,虽然你想要的可以实现

typedef std::map<std::string, int> myclass;

而且大多数人都不会理会typedef,尤其是现在我们有auto。如果您想在类中使用std::map 作为成员变量(以减少功能等),那么以下是一个起点:

class myclass
{
    std::map<std::string, int> m_data;
public:
    int& operator[](const char* cpszLabel)
    {
        return m_data[cpszLabel];
    }
};

【讨论】:

  • 谢谢,但我不确定这有什么帮助,我在哪里可以访问分配的数据?
  • @SPlatten:这将是类本身的数据,您可能需要“即时”创建。
【解决方案2】:

a["test"] = 123; 中,分配的“接收者”是从查找返回的对象,即string
不能重载string 的赋值运算符。

但是,众所周知,每个问题都可以通过引入间接级别来解决。

您可以存储自己的类型而不是 std::string,并让其处理转换。

一个非常小的例子作为说明:

struct Data
{
    template<typename T>
    Data& operator=(const T& rhs)
    {
        std::ostringstream os;
        os << rhs;
        value = os.str();
        return *this;
    }
    operator const char*() const { return value.c_str(); }
    std::string value;
};

struct Container
{
    Data& operator[] (const std::string& s) { return table[s]; }
    std::map<std::string, Data> table;
};

int main()
{
    Container cont;
    cont["foo"] = "bar";
    cont["baz"] = 123;
    cont["goo"] = 5.5;
    for (auto v: cont.table)
    {
        std::cout << v.first << " --> " << v.second << '\n';
    }
}

输出:

baz --> 123
foo --> bar
goo --> 5.5

【讨论】:

    猜你喜欢
    • 2013-03-30
    • 2016-08-30
    • 1970-01-01
    • 1970-01-01
    • 2012-08-17
    • 2018-12-27
    • 2012-04-23
    • 2012-04-22
    • 2015-06-01
    相关资源
    最近更新 更多