C++运算符重载[],数据参数在哪里分配?

C++运算符重载[],数据参数在哪里分配?,c++,operator-overloading,C++,Operator Overloading,我想在类中为运算符[]添加重载。运算符重载不是我以前必须做的事情 我想编写一个实现来执行以下操作: myclass a; a["test"] = 123; int test = a["test"]; 到目前为止,在我的课堂上,原型如下所示: string operator[](const char* cpszLabel); string myclass::operator[](const char* cpszLabel) {

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

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

    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[](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);
    }

您需要安排一些内容,以便运算符[]const char*cpszLabel返回对类中某些内容的引用

int&运算符[]常量字符*cpszLabel

可能是一个更好的原型

然后可以通过该引用修改类中的某些内容。老实说,你想要的东西可以用

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

您需要安排一些内容,以便运算符[]const char*cpszLabel返回对类中某些内容的引用

int&运算符[]常量字符*cpszLabel

可能是一个更好的原型

然后可以通过该引用修改类中的某些内容。老实说,你想要的东西可以用

typedef std::map<std::string, int> myclass;
在[测试]=123的情况下;,赋值的接收者是从查找中返回的对象,它是一个字符串。 不能重载字符串的赋值运算符

但是,众所周知,每一个问题都可以通过引入一个间接层次来解决

您可以存储自己的类型而不是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';
    }
}
在[测试]=123的情况下;,赋值的接收者是从查找中返回的对象,它是一个字符串。 不能重载字符串的赋值运算符

但是,众所周知,每一个问题都可以通过引入一个间接层次来解决

您可以存储自己的类型而不是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';
    }
}

谢谢,但我不知道这有什么帮助,我在哪里可以访问分配的数据?@Splaten:这将是类本身的数据,您可能需要动态创建。谢谢,但我不确定这有什么帮助,我在哪里可以访问分配的数据?@Splaten:这将是类本身的数据,您可能需要动态创建。评论不用于扩展讨论;此对话已结束。评论不用于扩展讨论;这段对话已经结束。