我开始编写一个库并考虑它的界面。我编写的以前的库都使用原始指针(内部和接口),现在我想尝试VS2010附带的智能指针库。
请帮助:)
答案 0 :(得分:5)
如果不能更多地了解您的设计原则以及您希望如何使用该库,那么回答这些问题是不可能的。
所以我只能根据自己的经验以及如何使用我的库来回答。
例如:
#if defined(MY_PROJ_SHARED_PTR_FROM_BOOST)
#include <boost/shared_ptr.hpp>
#define MY_PROJ_SHARED_PTR_NAMESPACE boost
#elif defined(MY_PROJ_SHARED_PTR_FROM_STD)
#include <memory>
#define MY_PROJ_SHARED_PTR_NAMESPACE std
#elif defined(MY_PROJ_SHARED_PTR_FROM_TR1)
#include <tr1/memory>
#define MY_PROJ_SHARED_PTR_NAMESPACE std::tr1
#else
#error "MY_PROJ_SHARED_PTR_FROM_<XXX> not defined correctly"
#endif
namespace X
{
using ::MY_PROJ_SHARED_PTR_NAMESPACE::shared_ptr;
}
int main()
{
X::shared_ptr<int> data;
}
我相信还有其他方法可以做到这一点 但现在已经很晚了。
答案 1 :(得分:0)
答案 2 :(得分:0)
我想在这里使用80-20规则。如果80%的客户更好地使用boost / stl / C ++,那么请这样做。对于其余部分,您可以构建适配器层并将复杂性移动到该层。适配器设计模式是我最喜欢的用途。
答案 3 :(得分:0)
从用户的角度来看,我要说你只需要在界面中清楚地知道你需要什么。
您需要对象的副本还是指针?
在内部,你可以使用你最有意义的指针类型,只要它不会降低性能太多并且不会导致错误。
要问的问题是你究竟会用指针做什么?你会删除吗?如果我更新/删除对象(例如GUI库的话),我可以更改引用吗。
作为一个通常不会使用智能指针的人,当他们不需要看到太多的智能指针时,会告诉我你不会注意你会做什么,并且是造成潜在错误的原因。
作为一个库用户,我更喜欢崩溃(当试图取消引用一个明显无效的指针时)周围有一个半有效指针实际上并不是我所期望的(我怀疑这可能是使用智能指针的一个问题) shared_ptr kind)。