我有一个代码,如果简化将如下所示:
void foo(MyObject& y){
int 2;
MyObject y(2);
}
int main (int argc, char** argv) {
MyObject x;
foo(x);
x.run();
}
然而,我收到错误消息"错误:声明' MyObject y'阴影参数。请注意,foo()最初是一个复杂得多的函数,即我不想将foo的代码复制并粘贴到main(尽管在上面的例子中看起来非常可能)。我想在这里做的是将myObject x传递给main()中的foo,在foo()中初始化x,并在main中调用x.run()。
有什么想法吗?
答案 0 :(得分:5)
您无法初始化对象两次。你可以做的是为它分配一个不同的值:
void foo(MyObject& y){
int n = 2;
y = MyObject(n);
}
或者,编写一个初始化对象并返回它的函数:
MyObject foo(){
int n = 2;
return MyObject(n);
}
MyObject m(foo());
答案 1 :(得分:0)
您对foo()
的定义不符合您的想法,它有一个名为y
的参数和一个名为y
的局部变量;他们没有提到同一个对象。
void foo(MyObject& y){
int 2;
MyObject y(2); // This is a new instance of MyObject independent of the parameter y
}
解决方案包括:
MyObject
添加“修饰符”方法以更改其状态y.set(2)
,MyObject
并将其分配给y:y = MyObject(2)
,return MyObject(2)
(不需要参考参数)。最后两个要求您的类具有合适的复制语义,如果对象不是微不足道的话,可能需要定义复制构造函数或赋值运算符。