Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/150.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ c++;重载[]运算符以进行写入/设置_C++_Operator Overloading - Fatal编程技术网

C++ c++;重载[]运算符以进行写入/设置

C++ c++;重载[]运算符以进行写入/设置,c++,operator-overloading,C++,Operator Overloading,我已经做了很多搜索,找到了大量的示例和教程,但仍然不知道在写入[]操作符时如何获取值 我觉得我快要疯了。我一定错过了一些很简单的东西 据我所知,get和set只有一个函数,它看起来像这样: V& operator[](string K); 或者这个: double &operator[](int n); 现在很好,我们可以得到: a[HERE] a[4] = HERE 这里的变为double&运算符[](此处为int) 我们可以很容易地使用它 但我们如何才能得到: a

我已经做了很多搜索,找到了大量的示例和教程,但仍然不知道在写入
[]
操作符时如何获取值

我觉得我快要疯了。我一定错过了一些很简单的东西

据我所知,
get
set
只有一个函数,它看起来像这样:

V& operator[](string K);
或者这个:

double &operator[](int n);

现在很好,我们可以得到:

a[HERE] 
a[4] = HERE
这里的
变为
double&运算符[](此处为int)
我们可以很容易地使用它

但我们如何才能得到:

a[HERE] 
a[4] = HERE

C#有两个非常清晰的get和set方法,其中value关键字表示被分配的对象

public string this[int key]
{
    get
    {
        if(key == 1)
           return "1!";
        if(key == 2)
           return "2!";
        else
           return "3!";
    }
    set
    {
        if( value == "setting")   //value is a[3] = THIS
           this.isSet = true;
    }
}

不要将
操作符[]
视为获取或设置的函数,这可能会让人困惑。将其视为一个正常函数。事实上,让我们把它写成一个普通函数:

struct X
{
    int arr[10];
    int& getIndex(int idx) { return arr[idx]; }
};

//...
//initialize x of type X
x.getIndex(3) = 42;
方法
x.getIndex(3)
将返回对成员数组
idx
中第4个元素的引用。因为您通过引用返回,所以返回值是一个l值,并引用该元素,因此您可以为其指定一个值,例如,
42
。这将修改成员
x.arr[3]
,因为函数返回该特定对象的别名

现在,您可以完全按照前面的
operator[]
重新编写它

struct X
{
    int arr[10];
    int& operator[](int idx) { return arr[idx]; }
};
并通过调用

x[3];
甚至

x.operator[](3);

运算符选项只是语法上的糖。

在返回该值的
运算符[]
中,您不会得到返回值赋值的右侧。当您在返回值的类型上重载
操作符=
时,您将得到它的右侧。为了说明这一点:
a[5]=此处
大致相当于
V&ret=a.operator[](5);ret.operator=(此处)那么,
a[4]=此处
意味着(直觉上,假设操作符的行为与内置类型一致)“在此处分配给
a[4]
”(假设
a
不是常量,这里是在某处定义的宏/变量)。关于这件事你有什么问题?可能是我想的地图场景的复制品。如何设置键/值对,如:myMap[key]=value;好的,所以不可能根据值和键在[]重载中进行逻辑运算?@EpiX你是如何得出这个结论的?@LuchianGrigore:他是对的,不是吗?该值未传递给
运算符[]
,因此它如何对其进行操作?@LuchianGrigore:因为x[key]计算结果为内存中的某个位置,然后=值将该值分配给内存中的该位置。在x[key]=value@juanchopanza是的,他试图在C++中重用他的C语言习语,但它不会起作用。我只是指他在这个问题下面的评论。他的评论是正确的。在表达式
x[key]=value
中,
运算符[]
不能基于
value
的值进行操作。至少我想不出有什么合理的办法。这并不意味着他不能按照自己的意愿编写代码,只是他不能按照自己想要的方式或习惯的方式编写代码。