2015-10-07 52 views
1

考虑一个代码,其中结构包含成员变量bar和成员引用变量,引用bar。例如:使复制的成员引用变量引用复制的成员,而不是原始的

struct Foo{ 
    double bar; 
    double &bar_ref=bar; 
}; 

void receivesFoo(Foo cp_foo){ 
    //&cp_foo.bar_ref is the same as &my_foo.bar_ref 
} 

int main(){ 
    Foo my_foo; 
    receivesFoo(my_foo); 
    return 0; 
} 

的问题是,如果你犯了一个Foo的副本通过,例如,把它传递给一个函数,cp_foo.bar_ref将把my_foo.bar而不是cp_foo.bar。我怎样才能让它参考cp_foo.bar而不是?

注意:为了方便命名,我使用了这些引用变量,因为一些tutorials使它看起来像一个可能的用法,我宁愿避免与宏相关的所有可读性问题。

回答

1

一种选择是使用的member initializer list一个copy constructor

struct Foo{ 
    double bar; 
    double &bar_ref; 
    Foo():bar_ref(bar){} 
    Foo(const Foo& a):bar_ref(bar){} 
}; 

这似乎是工作,但增加了其保持与类似的代码,两个独立的初始化列表的不便。如果你被允许使用C++ 11您可以通过避免它:

struct Foo{ 
    double bar; 
    double &bar_ref=bar; 
    Foo(){} 
    Foo(const Foo& a){} 
}; 

注意,如果你使用指针

由于@juanchopanza评论可能会遇到类似的问题,您也可以提高在前面的例子通过使用默认关键字。见this question了解更多详情:

struct Foo{ 
    double bar; 
    double &bar_ref=bar; 
    Foo()=default; 
    Foo(const Foo& a){} 
}; 
+2

也许'Foo()= default;'在第二个例子中更合适。它不会搞乱'bar'的值初始化。 – juanchopanza

+0

@juanchopanza,这对我来说是新的。我编辑了这篇文章,请检查它是否正确并且现在完成。谢谢。 – guivenca