2015-10-07 37 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