【问题标题】:C++ objects share attribute - use pointer or referenceC++ 对象共享属性 - 使用指针或引用
【发布时间】:2017-11-22 04:37:35
【问题描述】:

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

最后我创建了一些看起来像这样的东西: 我创建了一个类 A,其中包含对象 B 和对象 C 的向量,其中每个对象 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

感谢您的帮助

【问题讨论】:

    标签: c++ pointers object reference


    【解决方案1】:

    您可能需要一个指针,而不是引用。引用使得无法以自然的方式使用赋值运算符:

    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
    }
    

    你不能重新绑定一个引用,所以如果在上面的例子中&amp;(b1.c) != &amp;(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 库对于避免重复造轮子很有用。

    【讨论】:

    • 感谢您的建议和有用的链接,我会试试看!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-15
    • 1970-01-01
    • 1970-01-01
    • 2011-05-16
    • 1970-01-01
    • 2012-01-11
    相关资源
    最近更新 更多