gpt4 book ai didi

c++ - 一对一协会

转载 作者:行者123 更新时间:2023-11-28 08:24:18 28 4
gpt4 key购买 nike

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

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/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com