我想编写一个类,其中一些对象共享一个公共属性。
最后我创造了一个看起来像这样的东西: 我创建了一个带有对象B和对象C的向量的类A,其中每个对象b保存对c的引用。
Class A{
vector<B> v_b;
C c;
}
Class B{
C& c;
}
向量“v_b”中的对象应该能够改变“c”(向存储在c中的向量添加值)如果一个对象添加了一个值,它也应该被添加到向量中的所有其他对象中“ V_B”。这是主要的,为什么我想“分享”这个对象。
最终它并没有真正按照我希望的方式工作,我需要重新思考这个问题。
我现在的问题是,将C保存为参考或使用指针是否更好?
最后,我真的只需要矢量“v_b”,我对A类不感兴趣,我只使用A来创建一对带有“v_b”向量的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 :(得分: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)
,则无法将b2
分配给b1
。
正确的解决方案是做这样的事情:
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库对于避免重新发明轮子非常有用。