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)