मुझे लगता है कि मेरी समस्या सबसे अच्छा कोड में वर्णित है:सी ++ वैश्विक प्रारंभिक आदेश निर्भरताओं को अनदेखा करता है?
#include <stdio.h>
struct Foo;
extern Foo globalFoo;
struct Foo {
Foo() {
printf("Foo::Foo()\n");
}
void add() {
printf("Foo::add()\n");
}
static int addToGlobal() {
printf("Foo::addToGlobal() START\n");
globalFoo.add();
printf("Foo::addToGlobal() END\n");
return 0;
}
};
Foo globalFoo;
int dummy = Foo::addToGlobal();
int main() {
printf("main()\n");
return 0;
}
ऊपर प्रिंट (जीसीसी 4.4.3 के साथ):
Foo::Foo()
Foo::addToGlobal() START
Foo::add()
Foo::addToGlobal() END
main()
यह मैं क्या उम्मीद है, और तार्किक लगता है।
हालांकि, जब मैं निम्नलिखित लाइनों स्वैप:
Foo globalFoo;
int dummy = Foo::addToGlobal();
इस में
:
int dummy = Foo::addToGlobal();
Foo globalFoo;
कार्यक्रम आउटपुट निम्नलिखित:
Foo::addToGlobal() START
Foo::add()
Foo::addToGlobal() END
Foo::Foo()
main()
ऐसा लगता है Foo
की उदाहरण तरीकों एक उदाहरण का उपयोग कर कहा जा रहा है जो अभी तक नहीं है बनाया गया है! वैश्विक दायरे में एक चर के घोषणापत्र को स्थानांतरित करने के रूप में सरल कुछ प्रोग्राम के व्यवहार को प्रभावित कर रहा है, और इससे मुझे विश्वास होता है (1) ग्लोबल्स के प्रारंभिकरण के क्रम को परिभाषित नहीं किया गया है और (2) ग्लोबल्स के प्रारंभिकरण का क्रम सभी निर्भरताओं को अनदेखा करता है। क्या ये सही है? क्या यह सुनिश्चित करना संभव है कि Foo
के निर्माता को dummy
प्रारंभ करने से पहले कहा जाता है?
समस्या जो मैं हल करने की कोशिश कर रहा हूं वह वस्तुओं की एक संग्रह (Foo
का एक स्थिर उदाहरण) भर रहा है। मेरे वर्तमान प्रयास में, मैं एक मैक्रो का उपयोग कर रहा हूं जो (अन्य चीजों के साथ) एक वैश्विक परिवर्तनीय बनाता है (नामांकन से बचने के लिए अज्ञात नामस्थान में) जिसका प्रारंभिक स्थिर प्रारंभिकरण को ट्रिगर करता है। शायद मैं गलत कोण से अपनी समस्या का सामना कर रहा हूँ? क्या कोई बेहतर विकल्प है? धन्यवाद।
मैं अपना प्रश्न पोस्ट करने के बाद इस समाधान में आया था। मैंने कोशिश की, और ऐसा लगता है। हालांकि, एक समस्या हो सकती है: 'सिंगलटन' के अंदर 'स्थिर 'के कारण कई उदाहरण होंगे? यही है, 'फू :: सिंगलटन()' संभवतः विभिन्न चीजों को वापस कर सकता है यदि इसे हेडर फ़ाइल में घोषित और परिभाषित किया गया है और विभिन्न अनुवाद इकाइयों में शामिल किया गया है? – strager
इस पैटर्न के साथ एक और संभावित समस्या यह है कि AFAIK एक साथ सिंगलटन तक पहुंच सुरक्षित नहीं है। – FuleSnabel
@strager: जब स्थानीय चर को 'स्थैतिक' घोषित किया जाता है, तो इसका एक उदाहरण होगा, भले ही फ़ंक्शन को रेखांकित किया गया हो (यानी, अलग-अलग अनुवाद इकाइयों में अलग-अलग संकलित) लिंकर को यह सुनिश्चित करना चाहिए कि केवल एक ही परिभाषा चर मौजूद है। –