代码之家  ›  专栏  ›  技术社区  ›  hackjutsu Jan Galinski

静态方法返回类的shared\u ptr

  •  1
  • hackjutsu Jan Galinski  · 技术社区  · 7 年前

    在以下代码段中, MyClass MyClassPtr 对于 std::shared_ptr<MyClass> .

    有没有办法重新组织代码以便

    • MyClassPtr
    • 没有“声明” 类名

    代码如下:

    class MyClass;
    using MyClassPtr = std::shared_ptr<MyClass>;
    
    class MyClass {
    public:
        static MyClassPtr createMyClassInstance();
    
    private:
    /*Other members & methods*/
    }
    

    4 回复  |  直到 7 年前
        1
  •  3
  •   Community Michael Schmitz    4 年前

    简化 ,但您无法提供任何真正的代码,只能提供类定义的大纲。相反,我试图回答一个更明智的问题,即如何 您的代码。我建议

    1. MyClassPtr ,这不是真的必要(如果您使用 auto MyClassPtr 指的是 shared_ptr .

      之后 类定义,从而避免转发声明

    2. MyClass::createMyClassInstance 我建议说得更详细些 MyClass::createSharedPtr (无需 MyClass

    3. 别忘了 ;

    因此

    class MyClass
    {
    public:
        static std::shared_ptr<MyClass> createSharedPtr();    
    private:
        /* Other members & methods */
    };
    
    using MyClassSharedPtr = std::shared_ptr<MyClass>;  // optional
    

    总之,好的代码应该是自解释的,因此不一定是最简洁的,尽管必须避免冗余。

        2
  •  2
  •   Daniel H    7 年前

    Ptr 成员类型:

    class MyClass {
    public:
        using Ptr = std::shared_ptr<MyClass>;
        static Ptr createMyClassInstance();
    
    private:
    /*Other members & method*/
    };
    
    // ...
    
    MyClass::Ptr p = MyClass::createMyClassInstance();
    
        3
  •  0
  •   Community Michael Schmitz    4 年前

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

    MyClassPtr

    #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 };
     }
    
        4
  •  0
  •   Steephen    7 年前

    将返回类型替换为自动:

    class MyClass {
    public:
        static auto createMyClassInstance();
    
    private:
    /*Other members & method*/
    }
    

    Demo :