静态方法返回类的shared_ptr

时间:2017-09-06 23:21:57

标签: c++ c++11

在下面的代码段中,MyClass有一个返回其共享指针的静态方法。为了简化代码,我们对MyClassPtr使用别名std::shared_ptr<MyClass>

但是,为了实现这一点,我们在声明共享指针别名之前声明该类,然后在实际的类声明之后。它看起来很冗长。

是否有某种方法可以重新组织代码以便

  • 保留MyClassPtr别名(在整个项目中共享)
  • 没有&#34;声明&#34; MyClass两次

以下代码:

class MyClass;
using MyClassPtr = std::shared_ptr<MyClass>;

class MyClass {
public:
    static MyClassPtr createMyClassInstance();

private:
/*Other members & methods*/
}

我对当前的实现没问题。但如果能够改进代码,我想寻求有经验的人的建议。

4 个答案:

答案 0 :(得分:3)

你的问题有点模糊,因为你问的是代码如何简化,但是你没有提供任何真正的代码,只提供类定义的大纲。相反,我尝试回答关于如何改进代码的更明智的问题。我建议

  1. 避免别名MyClassPtr,它不是真的必要(如果使用auto则不应该使用它)但更重要的是减少代码的冗长度和可读性,因为MyClassPtr引用shared_ptr的名称并不明显。

    如果您坚持使用智能指针的简写,您可以在类定义之后定义此,从而避免前向声明

  2. MyClass::createMyClassInstance重命名为更详细的内容,我建议MyClass::createSharedPtr(不需要再次在函数名称中添加MyClass。)

  3. 在课程定义后忘记;
  4. 因此,

    class MyClass
    {
    public:
        static std::shared_ptr<MyClass> createSharedPtr();    
    private:
        /* Other members & methods */
    };
    
    using MyClassSharedPtr = std::shared_ptr<MyClass>;  // optional
    
    恕我直言,好的代码应该是不言自明的,因此不一定最简洁/简短,但必须避免冗余。

答案 1 :(得分:2)

使Ptr成为会员类型:

class MyClass {
public:
    using Ptr = std::shared_ptr<MyClass>;
    static Ptr createMyClassInstance();

private:
/*Other members & method*/
};

// ...

MyClass::Ptr p = MyClass::createMyClassInstance();

答案 2 :(得分:0)

用auto:

替换返回类型
class MyClass {
public:
    static auto createMyClassInstance();

private:
/*Other members & method*/
}

Demo

答案 3 :(得分:0)

  

是否有某种方法可以重新组织代码,以便

     

(1)保留MyClassPtr别名(它在整个项目中共享)

     

(2)没有&#34;声明&#34; MyClass两次

您接受两次声明MyClassPtr,您可以在课堂内声明它并且&#34;导出&#34;

之外
#include <memory>

class MyClass
 {
   public:
      using MyClassPtr = std::shared_ptr<MyClass>;

      static MyClassPtr createMyClassInstance();

   private:
      /*Other members & methods*/
 };

using MyClassPtr = MyClass::MyClassPtr;


int main()
 {
   MyClassPtr  np { nullptr };
 }