2011-06-16 167 views
13

我喜歡使用智能指針,並且看到了一些代碼,它可以很好地使用typedef s使它們變得更漂亮。例如:智能指針,類型定義和前向聲明

struct A { 
    typedef boost::shared_ptr<A> pointer; 
}; 

讓我寫:A::pointer a(new A);

但我已經在我的typedef幸福打了一個小的障礙: - /向前聲明...

所以,想象一下這樣的場景:

struct B; 
struct A { 
    boost::shared_ptr<B> b_; 
}; 

struct B { 
    boost::shared_ptr<A> a_; 
}; 

工作得不錯,但我很想清理一下。不幸的是,這是不起作用

struct B; 
struct A { 
    typedef boost::shared_ptr<A> pointer; 
    B::pointer b_; // <-- error here 
}; 

struct B { 
    typedef boost::shared_ptr<B> pointer; 
    A::pointer a_; 
}; 

我明白爲什麼,在文件中的那個點,編譯器沒有任何信息的B實際上有一個類型它命名pointer

我有一種感覺,我堅持使用舊的方法至少對某些東西,但我很樂意聽到一些聰明的想法。

回答

3

我能想到的兩種方法:

  • 您可以創建一個模板ptr_for,並用它喜歡的事,這ptr_for<B>::type b_ptr_;
  • 你可以PIMPL兩個結構(我知道這可能不是你」重新尋找),所以這些實現的定義可以出現在AB的定義之後。
4

如果你想分享的typedef你可能想使用命名空間來聲明他們:

struct A; 
struct B; 

namespace Aimpl { 
    typedef boost::shared_ptr<A> pointer; 
} 

namespace Bimpl { 
    typedef boost::shared_ptr<B> pointer; 
} 

struct A { 
    Bimpl::pointer b_; 
}; 

struct B { 
    Aimpl::pointer a_; 
}; 
6

即使用類型定義並不能使它prettier-它是毫無價值的。您可以將shared_ptr設置爲不完整類型,因此只需使用shared_ptr<B>即可。

+0

同意,只是留下一個評論,其餘的代碼應該使用B ::指針,因爲類型將是等效的 – totowtwo 2011-06-16 20:29:16