库应该使用使用智能指针的接口吗?

时间:2010-08-28 04:52:34

标签: c++ smart-pointers

我开始编写一个库并考虑它的界面。我编写的以前的库都使用原始指针(内部和接口),现在我想尝试VS2010附带的智能指针库。

  1. 界面应该使用智能指针吗? (可能强迫库用户也使用智能指针?)
  2. 如果接口使用原始指针但是库内部使用智能指针会不会很麻烦? (甚至可能吗?shared_ptr没有release()方法......)
  3. 两个符合c ++ 0x的智能指针库(比如boost和VS2010)可以互换使用吗? (假设我使用VS2010编写我的库,用户使用boost)
  4. 请帮助:)

4 个答案:

答案 0 :(得分:5)

如果不能更多地了解您的设计原则以及您希望如何使用该库,那么回答这些问题是不可能的。

所以我只能根据自己的经验以及如何使用我的库来回答。

  1. 是。
  2. 是。不要这样做。
  3. 混合它们可能不是一个好主意(尽管我从未尝试过) 但你可以弥补这一点:
    由于大多数开源都是作为源分发的,因此您可以构建源代码,以便可以将其配置为在许多环境中使用。
  4. 例如:

    #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)

  1. 取决于您是否认为#2或#3更重要。
  2. 不,除非他们是故意设计的。

答案 2 :(得分:0)

我想在这里使用80-20规则。如果80%的客户更好地使用boost / stl / C ++,那么请这样做。对于其余部分,您可以构建适配器层并将复杂性移动到该层。适配器设计模式是我最喜欢的用途。

答案 3 :(得分:0)

从用户的角度来看,我要说你只需要在界面中清楚地知道你需要什么。

您需要对象的副本还是指针?

在内部,你可以使用你最有意义的指针类型,只要它不会降低性能太多并且不会导致错误。

要问的问题是你究竟会用指针做什么?你会删除吗?如果我更新/删除对象(例如GUI库的话),我可以更改引用吗。

作为一个通常不会使用智能指针的人,当他们不需要看到太多的智能指针时,会告诉我你不会注意你会做什么,并且是造成潜在错误的原因。

作为一个库用户,我更喜欢崩溃(当试图取消引用一个明显无效的指针时)周围有一个半有效指针实际上并不是我所期望的(我怀疑这可能是使用智能指针的一个问题) shared_ptr kind)。