【发布时间】:2011-12-05 22:53:19
【问题描述】:
我在重载运算符 [] 以在对象中读取和写入时遇到问题。这是一个包含不同组件的大型代码,我不会在此处列出所有细节,因为它无济于事。简而言之,我拥有的是以下内容
class MyObject(){
inline SetterProxy& operator[](int i) {
SetterProxy a(i);
return a;
}
inline double operator[](int i) const{
return some_value;
}
}
第一个重载的 [] 可以很好地分配值(如果您想知道 SetterProxy 是什么,我必须使用 Proxy 类才能在分配值之前进行一些检查和内部函数调用)。但是,应该在读取时调用的第二个不起作用并且代码崩溃。我不确定这里发生了什么,但是当我注释掉第一个时,它就可以正常工作了!会不会是编译器以某种方式混淆了两者,因为它们都是内联的?
任何想法将不胜感激。
编辑: 好的,这里是 SetterProxy 本身:
class SetterProxy{
private:
Vec v;
int i;
double *ptr_val;
public:
inline SetterProxy(Vec v_, int i_) {
v = v_;
i = i_;
VecGetArray(v,&ptr_val);
}
inline ~SetterProxy(){
VecRestoreArray(v,&ptr_val);
}
inline void operator=(double rhs ){
ptr_val[i] = rhs;
}
};
虽然我不认为它直接来自那个。同样最初我让它按值返回,尽管将它更改为引用会更有效。我认为这应该是安全的,因为分配是在 Proxy operator=() 类中完成的,之后代理类超出了范围。无论哪种方式,这都不能解决我的问题!
【问题讨论】:
-
这可能与您在
SetterProxy中所做的事情有关吗?您能否用它的作用摘要更新问题? -
当
const对象或非const对象崩溃时,您是在调用operator[]吗? -
@seth:尝试了 const 和 non-const。调用
printf("%f\n",a[0]);之类的代码时,代码会崩溃。同样使用 cout 我得到了操作符