在另一个函数中初始化一个类

时间:2014-04-22 18:09:21

标签: c++ parameter-passing

我有一个代码,如果简化将如下所示:

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()。

有什么想法吗?

2 个答案:

答案 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)(不需要参考参数)。

最后两个要求您的类具有合适的复制语义,如果对象不是微不足道的话,可能需要定义复制构造函数或赋值运算符。