我有一个类Foo
,它封装了对向量的访问,并通过下标运算符提供对它的访问:
typedef int* IntPtr;
class Foo {
std::vector<IntPtr> bars;
IntPtr& operator[](size_t idx) {
return bars[idx];
}
};
在课程Bar
中,我想使用Foo
。虽然解决方案1有效,但它相当不方便。我更喜欢像解决方案2这样的东西。显然,方法调用(即使它返回一个左值)也不能被分配一些东西,尽管方法调用除了解决方案1之外什么都不做。
class Bar {
Foo *foo; //some initialization
IntPtr helper(size_t idx) {
return (*foo)[idx];
}
void barfoo() {
size_t baz = 1;
IntPtr qux;
//solution 1
qux = (*foo)[baz]; //works
(*foo)[baz] = &1; //works
//solution 2
qux = helper(baz); //works
helper(baz) = &1; //does not work: "expression is not assignable"
}
};
问题:如何简化重载下标运算符的使用?
编辑:已将使用的类型更改为int
至int*
。对不起,我在创建示例时搞砸了。
我猜问题是因为扭曲的int*&
。
答案 0 :(得分:1)
最好的方法是编写常规方法,例如Foo::at(size_t idx)
,提供与运算符相同的功能。
请注意,STL也是如此(只需看一下std::vector
)。
然后,您只需致电foo->at(baz);
即可。为避免冗长,您可以更改operator[]
的实现:
int& operator[](size_t idx) {
return at(idx);
}
在您的代码段中,您无法为返回值指定值,因为您忘记返回引用。
不是很好,但另一种选择是foo->operator[](baz);
,尽管我强烈反对你写这么难看的代码。
答案 1 :(得分:0)
织补。我只是忘了让helper
通过引用返回值:
IntPtr& helper(size_t idx)
或
int*& helper(size_t idx)