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

C++ 库应该使用使用智能指针的接口吗?,c++,smart-pointers,C++,Smart Pointers,我开始写一个库并考虑它的接口。我以前编写的库都使用原始指针(包括内部指针和接口指针),现在我想尝试VS2010附带的智能指针库 接口应该使用智能指针吗?(可能迫使库用户也使用智能指针?) 如果接口使用原始指针,而库在内部使用智能指针,会不会很混乱?(有可能吗?shared_ptr没有release()方法…) 两个兼容c++0x的智能指针库(比如boost和VS2010)能否互换使用?(假设我使用VS2010编写库,用户使用boost) 请帮忙:) 取决于你是否认为2或3是更重要的。 对 不,除

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

  • 接口应该使用智能指针吗?(可能迫使库用户也使用智能指针?)
  • 如果接口使用原始指针,而库在内部使用智能指针,会不会很混乱?(有可能吗?shared_ptr没有release()方法…)
  • 两个兼容c++0x的智能指针库(比如boost和VS2010)能否互换使用?(假设我使用VS2010编写库,用户使用boost)
  • 请帮忙:)

    取决于你是否认为2或3是更重要的。
  • 不,除非它们是故意设计的

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

    如果不进一步了解您的设计原则以及希望如何使用该库,就无法回答这些问题

    因此,我只能根据我的经验和我喜欢我的图书馆被使用的方式来回答

  • 对。不要这样做
  • 混合使用可能不是一个好主意(尽管我从未尝试过)。
    但您可以对此进行补偿:
    由于大多数开放源代码都是作为源代码分发的,所以您可以构建源代码,以便将其配置为在许多环境中使用
  • 例如:

    #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;
    }
    
    #如果已定义(我的项目已共享(来自)
    #包括
    #定义我的项目共享名称空间
    #已定义的elif(我的项目从标准共享)
    #包括
    #定义我的项目共享名称空间std
    #已定义elif(我的项目共享自TR1)
    #包括
    #定义我的项目共享名称空间std::tr1
    #否则
    #错误“MY_PROJ_SHARED_PTR_FROM_uu未正确定义”
    #恩迪夫
    名称空间X
    {
    使用::MY_PROJ_SHARED_PTR_命名空间::SHARED_PTR;
    }
    int main()
    {
    X::共享的ptr数据;
    }
    
    我相信还有其他方法可以做到这一点。

    但是已经很晚了。

    从用户的角度来看,我想说的是,您只需要在界面中明确您需要什么

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

    在内部,您可能可以使用最方便关闭的指针类型,只要它不会过度降低性能,也不会导致错误

    要问的一个问题是,您将如何使用该指针?你会删除它吗?如果我更新/删除对象(比如GUI库),是否可以更改引用


    作为一个在不需要智能指针时通常不使用智能指针的人,看到太多智能指针只会告诉我,你没有注意你将要做什么,这是潜在错误的原因


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

    1。是的,请强制您的用户形成良好的编程实践。:)“作为一个在不需要的时候通常不使用智能指针的人,看到太多的智能指针只会告诉我你没有注意你将要做什么”对。你能告诉我一个你不应该把指针包起来的情况吗?你能告诉我一个你应该包起来的情况吗?通常,所有权很容易评估,范围有限的ptr就足够了。其他指针只是别名,不需要任何特殊的指针。我认为在某些情况下,共享的ptr是有用的,但如果不是这样,我会把球扔给你,问你自己为什么要使用共享的ptr?我通常不会有太多问题来保留指针的所有权,并知道何时可以删除或不删除它。@n1ck:嗯,每种情况下。我有一个资源,我需要确保它被释放,无论是面对遗忘还是异常。唯一的方法是使用析构函数。我为什么不呢?我想要一个共享指针,因为我有一个共享资源…我不想关心它何时被释放,我只想知道它将被释放。我能想到的唯一情况是一个非所有权指针(无论如何,它会被包装在一些实用程序中,谁在使用非所有权指针有目的。)@N1C:我对你移动球门柱感到困惑。首先你说“不需要智能指针时,你不需要智能指针”,我说“不需要时”,现在你不知何故提出了作用域的ptr和共享的ptr。作用域\u ptr也是一个智能指针。。。例外是一个bug?!我想我们已经完成了,你显然不知道现代C++或好的编码实践。如果您不必显式地释放某些内容,那么您的代码将更干净、更安全。这并不是说它会杀死你,你可以在性能敏感的应用程序中使用它们;这不像他们的慢。你唯一的反对似乎是…@N1C:你说异常是一个bug,它们是一种语言特性。你说你不需要智能指针,也不使用它们,我说这是一种糟糕的做法。然后你开始说关于作用域指针是好的,共享指针不是(完全脱离主题),现在是关于崩溃。我不知道你在说什么。