2011-06-16 12 views
13

मुझे स्मार्ट पॉइंटर्स का उपयोग करना अच्छा लगता है, और कुछ कोड देखा है जो typedef के अच्छे उपयोग को सुंदर बनाता है। उदाहरण के लिए:स्मार्ट पॉइंटर्स, टाइपिफ और अग्रेषित घोषणाएं

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_; 
}; 

मुझे समझ में क्यों, फाइल में उस बिंदु पर, संकलक कोई जानकारी नहीं वास्तव में बी एक प्रकार में यह pointer नामित किया है कि है काम नहीं करता है।

मुझे एहसास है कि मैं कम से कम कुछ सामानों के लिए पुराने दृष्टिकोण का उपयोग कर फंस गया हूं, लेकिन मुझे कुछ चालाक विचार सुनना अच्छा लगेगा।

उत्तर

3

मैं दो तरीकों के बारे में सोच सकते हैं:

  • आप एक ptr_for टेम्पलेट बना सकते हैं और जैसे कि यह कुछ इस्तेमाल कर सकते हैं इस ptr_for<B>::type b_ptr_;
  • आप दो structs pimpl सकता है (मैं जानता हूँ कि यह शायद नहीं है कि तुम क्या ' फिर से तलाश रहे हैं) इसलिए कार्यान्वयन की परिभाषा A और B की परिभाषाओं के बाद दोनों दिखाई दे सकती है।
4

आप साझा करना typedefs आप शायद उन्हें घोषित करने के लिए नामस्थान उपयोग करना चाहते हैं चाहते हैं:

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

typedefs के उपयोग यह prettier- यह बेकार है नहीं है यही कारण है कि। आप एक अपूर्ण प्रकार के लिए shared_ptr बना सकते हैं, इसलिए बस shared_ptr<B> का उपयोग करें।

+0

सहमत हैं, बस एक टिप्पणी छोड़ दें कि बाकी कोड को बी :: पॉइंटर का उपयोग करना चाहिए, क्योंकि प्रकार बराबर होंगे – totowtwo