एक बार जब मैं एक शानदार सी ++ एफएक्यू पढ़ रहा था (यह वास्तव में अच्छा है !! https://isocpp.org/faq) और स्थिर प्रारंभिक आदेश "फियास्को" को रोकने के तरीके के बारे में विषय पढ़ें। इसलिए लेखक स्थैतिक चर को कार्यों में लपेटने की सलाह देते हैं, इस प्रकार चर के निर्माण क्रम को बनाए रखकर "फियास्को" को रोकने के लिए। लेकिन यह मुझे एक कठोर कामकाज लगता है। तो मेरा सवाल यह है कि क्या इस "फियास्को" को रोकने के लिए कोई आधुनिक, अधिक पैटर्न उन्मुख तरीका है लेकिन "स्थिर सामग्री" को कार्यों में लपेटने के लिए ???स्थैतिक प्रारंभिकरण आदेश "फियास्को", सी ++
उत्तर
आधुनिक, अधिक पैटर्न उन्मुख तरह से पहली जगह में वैश्विक उपयोग करने के लिए नहीं है।
इसके आसपास कोई दूसरा रास्ता नहीं है।
यह अन्यथा "फियास्को" नहीं होगा, अन्यथा!
दुर्भाग्यवश, यह यथार्थवादी नहीं है। यह एक ठेठ रेपो या जीएनयू की एफ़टीपी साइट में हजारों पैकेजों की मदद नहीं करता है। – jww
@jww: एकमात्र उचित विकल्प यह है कि ओपी स्वयं प्रश्न में क्या सुझाव दे। –
यह एक झूठी पसंद है। यह समस्या को चारों ओर ले जाता है ताकि दुर्घटना में विनाश का अनुभव हो; और एक कन्स्ट्रक्टर नहीं। जब मैंने ऑब्जेक्ट बहुत जल्द गायब हो जाता है तो मैंने पहले हाथ में दुर्घटना का अनुभव किया है। – jww
समस्या का समाधान करने का अधिक सामान्य तरीका है जब भी संभव हो वहां स्थिरता से बचें - और निर्माण आदेश पर भरोसा रखने वाली वस्तुओं के बीच और भी बहुत कुछ।
फिर आवश्यक क्रम में वस्तुओं का निर्माण करें। उदाहरण के लिए, अगर हम दो वस्तुओं x और y, और y के निर्माण है अगर एक्स का निर्माण नहीं किया गया है असफल हो जायेगी, तो x पहले का निर्माण और y के निर्माता (या किसी अन्य सदस्य))
SomeObject x;
SomeOtherObject y(x);
को यह आपूर्ति या
SomeObject *x = new SomeObject;
SomeOtherObject y = new SomeObject(*x);
(ऊपर के दोनों मान y
के निर्माता के लिए एक संदर्भ की आवश्यकता है)।
यदि आपको कार्यों के बीच x
और y
साझा करने की आवश्यकता है, तो बस उन्हें तर्क के रूप में कार्य करने के लिए पास करें।
यदि आपको स्टेटिक्स का उपयोग करना चाहिए (यानी आप हर जगह तर्क पारित करने की टाइपिंग नहीं चाहते हैं) तो स्टेटस पॉइंटर्स बनें, और उन्हें एक बार शुरू करें (उदाहरण के लिए, main()
में)।
// all source files can use x and y via these declarations (e.g. via a header file)
extern SomeObject *x;
extern SomeOtherObject *y;
// definition in one source file only
SomeObject *x;
SomeOtherObject *y;
int main()
{
x = new SomeObject;
y = new SomeOtherObject(*x);
// call other functions that use x and y.
delete y;
delete x;
}
लेकिन, वास्तव में, यदि संभव हो तो स्टेटिक्स का उपयोग करने से बचने के लिए सबसे अच्छा है।
तो मेरा सवाल यह है कि क्या इस "फियास्को" को रोकने के लिए कोई आधुनिक, अधिक पैटर्न उन्मुख तरीका है लेकिन "स्थिर सामग्री" को कार्यों में लपेटने के लिए ???
ज्यादातर मामलों में, आप मुख्य कार्य में अपने "वैश्विक" डेटा ऐलान करते हैं और निर्भरता इंजेक्शन का उपयोग जहां आवश्यक हो, चारों ओर इसे पारित कर सकते हैं। दूसरे शब्दों में, स्थिर स्थिति नहीं है।
प्रैक्टिस में, आपके पास ऐसी स्थितियां हो सकती हैं जहां स्थिर डेटा की आवश्यकता हो। यदि अन्य सांख्यिकी के लिए कोई निर्भरता नहीं है, तो स्थिर डेटा const/constexpr
बनाएं।
// smart pointer that implements the "Foo" release policy
class FooPointer
{
static const FooPointer NullFoo; // does not depend on other static values
/* ... */
};
मामले में स्थैतिक चर एक दूसरे पर निर्भर करते हैं, सिर्फ स्थिर कार्यों में उन्हें लपेट:
// smart pointer that implements the "Foo" release policy
class FooPointer
{
static const FooPointer& NullFoo(); // depends on other static values
/* ... */
};
संक्षेप में:
अधिकांश (90% 99%?) स्थैतिक/वैश्विक/साझा डेटा निर्भरता-इंजेक्शन होना चाहिए जहां इसका उपयोग किया जाता है, और स्थिर के रूप में नहीं बनाया गया है।
दुर्लभ मामलों में जब किसी कारण या किसी अन्य के लिए स्थिरता की आवश्यकता होती है और वे अन्य स्थिरताओं पर निर्भर नहीं हैं, स्थिर चर घोषित करें।
में दुर्लभ मामलों में जब सांख्यिकी को स्थैतिक होने की आवश्यकता होती है और वे एक दूसरे पर निर्भर करते हैं, तो उन्हें स्थिर तरीकों से लपेटें।
अंगूठे के नियम के रूप में, यदि आपके पास दूसरे और तीसरे मामले हैं, तो आप पहले पर्याप्त नहीं कर रहे हैं।
- 1. सी ++ स्थैतिक प्रारंभिकरण आदेश
- 2. सी ++ स्थिर कॉन्स और प्रारंभिकरण (क्या कोई फियास्को है)
- 3. स्थैतिक संपत्ति प्रारंभिकरण
- 4. सी ++ - सदस्य प्रारंभिकरण और वृद्धि का आदेश
- 5. सी ++: क्लास डेटा सदस्यों का प्रारंभिकरण आदेश
- 6. जी ++, स्थैतिक प्रारंभिकरण और -nostdlib
- 7. वसंत बीन प्रारंभिकरण का आदेश
- 8. जावा कन्स्ट्रक्टर और फील्ड प्रारंभिकरण आदेश
- 9. मानक द्वारा गारंटीकृत प्रारंभिकरण का आदेश है?
- 10. पायथन मॉड्यूल प्रारंभिक आदेश?
- 11. सी ++ स्थैतिक परिवर्तनीय inialization और धागे
- 12. सी ++ - गैर स्थैतिक स्थैतिक वस्तु बनाम स्थानीय स्थैतिक वस्तु
- 13. स्थैतिक बनाम बाहरी "सी"/"सी ++"
- 14. स्थिर क्षेत्र प्रारंभिकरण सी # में कैसे काम करता है?
- 15. प्रारंभिकरण के वर्ग घटक क्रम
- 16. सी # सदस्य परिवर्तनीय प्रारंभिकरण; सर्वश्रेष्ठ प्रणालियां?
- 17. सी ++ ऑब्जेक्ट प्रारंभिकरण और कन्स्ट्रक्टर सेमेन्टिक्स
- 18. सी ++ कक्षा प्रारंभिकरण जिसमें क्लास वेरिएबल प्रारंभिकता
- 19. सी # एरे प्रारंभिकरण - गैर-डिफ़ॉल्ट मान
- 20. स्थैतिक?
- 21. सी ++ स्थैतिक सदस्य परिवर्तनीय दायरा
- 22. सी # स्थैतिक वर्ग और ऑपरेटर
- 23. सी # निजी, स्थैतिक, और केवल
- 24. उद्देश्य-सी प्रोटोकॉल स्थैतिक विधि?
- 25. सी # स्थैतिक क्षेत्र, उदाहरण कन्स्ट्रक्टर
- 26. Django प्रारंभिकरण
- 27. log4net प्रारंभिकरण
- 28. सी # आदेश संयोजन एल्गोरिदम
- 29. क्यों आदेश जब सी #
- 30. मूल्यांकन का आदेश सी #
फियास्को को रोकने का सुरुचिपूर्ण तरीका किसी भी चीज़ पर निर्भर स्थिर वस्तुओं का कभी भी उपयोग नहीं करना है। – user2079303
अक्सर पूछे जाने वाले प्रश्न * पहले उपयोग मुहावरे * पर निर्माण के बारे में सलाह देते हैं। कई सी ++ प्रोग्रामर के लिए एक familar पैटर्न। इसे लागू करना और उपयोग करने में आसान भी आसान है। मैं नहीं देख सकता कि आपका मतलब "आधुनिक, अधिक पैटर्न उन्मुख तरीके" से क्या है। –
यह भी देखें [पताSanitizerInitializationOrderFiasco] (https://github.com/google/sanitizers/wiki/AddressSanitizerInitializationOrderFiasco)। – jww