2017-09-06 69 views
1

在下面的片段中,MyClass有一個返回其共享指針的靜態方法。爲了簡化代碼,我們使用別名MyClassPtr代替std::shared_ptr<MyClass>靜態方法返回類的shared_ptr

但是,爲了實現這一點,我們在聲明共享指針別名之前聲明該類,然後遵循實際的類聲明。它看起來很冗長。

是否有某種方式來重新組織代碼,以便

  • 保持MyClassPtr別名(它是整個項目共享)
  • 沒有「聲明」的MyClass兩次

代碼:

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

class MyClass { 
public: 
    static MyClassPtr createMyClassInstance(); 

private: 
/*Other members & methods*/ 
} 

我可以用當前imp lementation。但如果代碼可以改進,我想尋求經驗豐富的人的建議。

+0

相關?重複? https://stackoverflow.com/questions/1008019/c-singleton-design-pattern – Galik

+0

這裏與Singleton模式沒有任何關係......不知道它爲什麼是重複的... – hackjutsu

回答

0

是有一些方法來重新組織代碼,以便

(1)保持MyClassPtr別名(它是在整個項目共享)

(2)沒有 「聲明」 MyClass的兩次

你,你接受申報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 }; 
} 
0123內
0

替換自動返回類型:

class MyClass { 
public: 
    static auto createMyClassInstance(); 

private: 
/*Other members & method*/ 
} 

Demo

+0

你可能仍然想要'使用'語句,就在課後。 –

+0

是的,爲了簡潔,其他類將使用'MyClassPtr'。在這種情況下,這就是「使用」的重點。 – hackjutsu

2

Ptr會員類型:

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

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

// ... 

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

你的問題是有些模糊,因爲你問如何代碼是簡化了,但你沒有提供任何真正的代碼,只有定義一個類的輪廓上。相反,我試圖回答更明智的問題,即如何改進您的代碼。我建議

  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 

IMHO,良好的代碼應該是不言自明的,因此不一定最簡潔/簡言之,雖然冗餘必須避免。

+0

謝謝,'createMyClassInstance'只是我用來說明方法目的的一個隨機名稱。我想知道有沒有辦法避免聲明'MyClass'「兩次」。 – hackjutsu

+0

這沒有什麼錯。您只定義一次,但可以隨時隨地進行聲明。 – Walter