2017-06-19 91 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