我正在开发一个库,其中包含一些类,我们称之为
经过一些讨论,我发现将共享指针返回给库用户并不是一个好主意,因为在这种情况下,我无法确保对象可以精确地从我的库内存中删除。返回弱指针也有同样的问题,因为如果 API 的用户
最终的想法是公开某些弱指针的包装器。包装器类可以像这样:
C1、C2 和 … Cn
。每个类都实现了一些接口,例如 I1、I2、… Im
(n>m)。库中对象之间的关系很复杂,我必须为我的库用户提供一些 API,以使用智能指针访问这些对象。经过一些讨论,我发现将共享指针返回给库用户并不是一个好主意,因为在这种情况下,我无法确保对象可以精确地从我的库内存中删除。返回弱指针也有同样的问题,因为如果 API 的用户
.lock()
弱指针并将所得到的共享指针放在某个地方,我会再次面临同样的问题。最终的想法是公开某些弱指针的包装器。包装器类可以像这样:
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
};
如您所见,所有这些包装器类都共享相同的实现。 减少所有这些包装器类代码的最佳方式是什么? 有没有避免重复相似代码的方法?