【发布时间】:2020-02-19 10:45:35
【问题描述】:
我正在开发一个包含一些类的库,我们称它们为C1, C2 and ... Cn。这些类中的每一个都实现了一些接口,即I1, I2, ... Im. (n > m)。库中对象之间的关系很复杂,我不得不
为我的库用户提供一些 API 以使用智能指针访问这些对象。
经过一番讨论,我发现将共享指针返回给库用户并不是一个好主意,因为在这种情况下,我无法确保可以在我的库内存中精确删除对象。返回弱指针也有同样的问题,因为如果 API .lock()s 的用户使用弱指针并将结果共享指针保存在某处,我将再次面临同样的问题。
我的最后一个想法是为弱指针公开某种包装器。包装类可以是这样的:
class Wrapper_C1 : public I1
{
std::weak_ptr<C1> mC1;
public:
Wrapper_C1() = delete;
Wrapper_C1(const std::weak_ptr<C1> & c1) : mC1(c1)
{
}
int method1_C1(int x)
{
if (auto sp = mC1.lock())
{
sp->method1_C1(x);
}
else
{
throw std::runtime_error("object C1 is not loaded in the lib.");
}
}
void method2_C1(double y)
{
if (auto sp = mC1.lock())
{
sp->method2_C1(y);
}
else
{
throw std::runtime_error("object C1 is not loaded in the lib.");
}
}
// The same for other methods
};
如您所见,所有这些包装类都共享相同的实现。减少所有这些包装类的代码的最佳方法是什么?有没有办法避免重复类似的代码?
【问题讨论】:
-
你的意思是“重构”吗?
-
@dandan78 不,我编辑了帖子标题。
-
元编程(接口名称可以是静态的)或桥接设计模式应该不错。
-
@seccpur 有什么例子吗?
-
@Gupta 这可能与
__declspec(propety一起实现......这可以允许getter(结帐)和setter(签入)同时仍然制作'。'可能的语法 - 这至少需要clang或 msvc
标签: c++ c++11 shared-ptr smart-pointers weak-ptr