2017-06-19 90 views
-1

我想寫一個類,其中一些對象共享一個共同的屬性。C++對象共享屬性 - 使用指針或引用

最後我創建了一個如下所示的東西: 我創建了一個類A,它帶有一個對象B和一個對象C的向量,其中每個對象b都保存對c的引用。

Class A{ 
    vector<B> v_b; 
    C c; 
} 

Class B{ 
    C& c; 
} 

在載體「V_B」的對象應該能夠改變「C」(一個值加到保存在c的向量)如果一個對象增加了一個值,它也應該被添加到所有其他OBJETS在矢量「v_b」中。這是主要的想法,爲什麼我想「分享」這個對象。

最後,它並不像我想要的那樣工作,我需要重新考慮這個問題。

我現在的問題是,保存C作爲參考還是使用指針更好?最後,我真的只需要向量「v_b」,我對A類不感興趣,我只用A創建了一個帶有「v_b」向量的A對象,並且比我使用了a getter獲取所有「v_b」並將它們保存在一個通用向量中。

例子:

vector<b> v; 
{ 
    A a1; 
    a1.add_b_to_vector(B b1); // b1 and b2 should share a common c 
    a1.add_b_to_vector(B b2); 
    A a2; 
    a2.add_b_to_vector(B b3); // b3 and b4 should share a common c 
    a2.add_b_to_vector(B b4); 
    v.push_back(a1.get_vector_of_bs()); //lets assume push_back would work 
    v.push_back(a2.get_vector_of_bs()); 
} 
// do something with v 

感謝您的幫助

回答

0

你可能會希望有一個指針,而不是一個參考。參考使其無法使用賦值運算符在一個自然的方式:

class B 
{ 
public: 
    B(const B&) = default; 
    B& operator=(const B&) = default; 

private: 
    C& c; 
}; 

void assign(B& b1, const B& b2) 
{ 
    b1 = b2; // this will not work! operator= is deleted 
} 

你不能重新綁定一個參考,因此,如果在上面的例子中&(b1.c) != &(b2.c),也不可能分配到b2b1

正確的解決辦法是做這樣的事情:

class B 
{ 
public: 
    B(C& _c) : c{ &_c } {} 

    B(const B&) = default; 
    B& operator=(const B&) = default; 

private: 
    C* c; 
}; 

這將確保你永遠無法用一個空指針值最終爲c,同時還允許您使用賦值運算符以自然的方式。

順便說一句,這是flyweight pattern的一個例子。您可能會發現Boost.Flyweight庫有用,以避免重新發明車輪。

+0

感謝您的建議和有用的鏈接,我會嘗試一下! – user7431005