Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/164.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++_Operator Overloading_Subscript - Fatal编程技术网

C++ 如何通过指针简化重载下标运算符的使用?

C++ 如何通过指针简化重载下标运算符的使用?,c++,operator-overloading,subscript,C++,Operator Overloading,Subscript,我有一个类Foo,它封装了对向量的访问,并通过下标操作符提供对向量的访问: typedef int* IntPtr; class Foo { std::vector<IntPtr> bars; IntPtr& operator[](size_t idx) { return bars[idx]; } }; 问题:如何简化重载下标运算符的使用 编辑:将使用的类型从int更改为int*。抱歉,我在创建示例时搞砸了 我想问题是因为扭曲的int*&

我有一个类
Foo
,它封装了对向量的访问,并通过下标操作符提供对向量的访问:

typedef int* IntPtr; 

class Foo {
   std::vector<IntPtr> bars;
   IntPtr& operator[](size_t idx) {
      return bars[idx];
   }
};
问题:如何简化重载下标运算符的使用

编辑:将使用的类型从
int
更改为
int*
。抱歉,我在创建示例时搞砸了


我想问题是因为扭曲的
int*&

最好的方法是编写一个常规方法,例如
Foo::at(size\t idx)
,提供与操作符相同的功能。 请注意,STL也做了同样的事情(请看一下
std::vector
)。 然后,您只需调用
foo->at(baz)。为避免格式副本,您可以更改
运算符[]
的实现:

int& operator[](size_t idx) {
    return at(idx);
}
在代码段中,您无法为返回赋值,因为您忘记了返回引用


不是很好,但另一种选择是
foo->operator[](baz)虽然我强烈劝阻你写这么难看的代码。

该死。我忘了让
helper
通过引用返回值:

IntPtr& helper(size_t idx) 


即使这样,
foo->at(baz)=1也不可能。@mort为什么不呢?应该是的,嗯?为什么不呢
at
是一个常规方法,您可以像调用其他方法一样调用它。使用
->
运算符从指针调用方法。STL同时定义
运算符[]
at()
,因为它们具有完全不同的语义:
at()
进行边界检查,
运算符[]
不进行边界检查。如果不是因为语义上的差异,拥有这两个函数只会是代码膨胀。E不应该做的事情。发现错误(见我的答案)。我对你的答案投了赞成票(它引导我走上正确的道路……),但我不想接受它,因为它实际上并不正确。如果您编辑它,我会很高兴地接受它来奖励您:)(一旦我修复了
Foo::operator[]
的可访问性)。您当然可以分配给函数返回的左值引用。您确定错误来自该代码吗?如果帮助程序返回引用,您的解决方案2工作,您使用的编译器是什么?因为那条线应该有用。。。
IntPtr& helper(size_t idx) 
int*& helper(size_t idx)