C ++对象共享属性 - 使用指针或引用

时间:2017-06-19 20:29:06

标签: c++ pointers object reference

我想编写一个类,其中一些对象共享一个公共属性。

最后我创造了一个看起来像这样的东西: 我创建了一个带有对象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

感谢您的帮助

1 个答案:

答案 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库对于避免重新发明轮子非常有用。