gpt4 book ai didi

c++ - 通过隐式类型转换模拟接口(interface)

转载 作者:太空狗 更新时间:2023-10-29 21:39:58 24 4
gpt4 key购买 nike

假设我有几个类A1A2A3,它们的数据可以存储在同一个POD数据结构中D。这些类在数据管理方式方面有所不同,例如,在何处分配动态数据结构。然而在语义上,它们代表所有相同类型的数据。

我的一个 A? 类被设计成围绕 D 的包装器。它可以基于现有的 D 构建,而无需复制它。

现在我想以统一的方式实现对所有 A? 类的读取访问。我不想使用虚方法,也不想模板化所有使用 A? 类的代码。

这样的设计合理吗?

这个图案有名字吗? (外观?)

有什么明显的陷阱吗?

/* in practice, D is large or should not be copied for other reasons */
struct D { int * mymember; }

struct ACRef {
ACRef (D const & d) : m_dataref (&d) { }
/* operations for A-like classes */
int getMyMember () const { return *(m_dataref->mymember); }
private:
D const * m_dataref;
};

struct A1 {
/* A1 stuff, manages m_data.mymember in a particular way */

// implicit conversion to ACRef possible
// kind of "is a" relationship: an A1 "is an" ACRef
operator ACRef () { return ACRef {this->m_data}; }
private:
D m_data;
};

struct A2 {
explicit A2 (D & d) : m_data (&d) { }

/* A2 stuff, manages m_data.mymember in a particular way */

// implicit conversion to ACRef possible
// kind of "is a" relationship: an A2 "is an" ACRef
operator ACRef () { return ACRef {*(this->m_data)}; }
private:
D * m_data;
};

/* A3 defined similar to A1 */

/* function that should operate on A?'s */
int printMyMember (ACRef a) {
std::cout << a.getMyMember () << std::endl;
}

A1 a1;
A2 a2;
// ...
printMyMember (a1);
printMyMember (a2);

最佳答案

我看到这种方法的唯一缺点是您最终会得到多个隐式共享状态的对象。所以例如按值传递 ACRef 没有典型含义。但只要您只允许通过 ACRef 进行读取访问,就不会成为大问题。
如果代理类型最终出现在与原始对象不同的线程中,那么您必须非常小心。

关于c++ - 通过隐式类型转换模拟接口(interface),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31707212/

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