用C ++表示一对一对象关联的最佳方法是什么?它应尽可能自动且透明,这意味着当一端设置或重置时,另一端将被更新。类似指针的接口可能是理想的:

template<typename AssociatedType>
class OneToOne{
    void Associate(AssociatedType &);
    AssociatedType &operator* ();
    AssociatedType *operator->();
}


有没有更好的方法或有完整的实现?

编辑:

所需行为:

struct A{
    void Associate(struct B &);
    B &GetAssociated();
};

struct B{
    void Associate(A &);
    A &GetAssociated();
};

A a, a2;
B b;

a.Associate(b);
// now b.GetAssociated() should return reference to a

b.Associate(a2);
// now b.GetAssociated() should return reference to a2 and
// a2.GetAssociated() should return reference to b
// a.GetAssociated() should signal an error

最佳答案

未经测试,但您可以使用简单的装饰器

template <typename A1, typename A2>
class Association
{
public:
  void associate(A2& ref)
  {
    if (_ref && &(*_ref) == &ref) return; // no need to do anything
    // update the references
    if (_ref) _ref->reset_association();
    // save this side
    _ref = ref;
    ref.associate(static_cast<A1&>(*this));
  }

  void reset_association() { _ref = boost::none_t(); }

  boost::optional<A2&> get_association() { return _ref; }

private:
  boost::optional<A2&> _ref;
};


现在:

struct B;

struct A : public Association<A, B> {
};

struct B : public Association<B, A> {
};


现在,这些操作应正确​​处理。

A a, a2;
B b;

a.associate(b);
b.associate(a2);


注意:我使用boost::optional来保存引用而不是指针,没有什么阻止您直接使用指针。我认为在C ++中默认情况下不存在您需要的构造,这就是为什么您需要类似上面的内容才能使其工作的原因...

关于c++ - 一对一关联,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4584518/

10-12 21:20