मैं निम्नलिखित सेटअप सही पाने के लिए कोशिश कर रहा हूँ की बुला आदेश लागू करने के लिए कैसे करें: (एकाधिक स्रोत फ़ाइलें, संकलन इकाइयों के साथ)विनाशकर्ता
एक दिया आवेदन प्रकार class A
कई संकलन इकाइयों में परिभाषित की वैश्विक चर है। इन्हें class B
(जहां केवल 1 उदाहरण मौजूद होना चाहिए) को पेश करने के लिए नए द्वारा "प्रबंधित" होना चाहिए, इस अर्थ में कि वे कक्षा बी के उदाहरण पर और "विनाश" पर स्वयं को "पंजीकरण" करते हैं।
कन्स्ट्रक्टर के लिए काम करने के लिए चीज को सेट करना काफी सीधे है। एक का उपयोग कर सकते हैं:
types.h
:
class B {
static B& Instance() {
static B singleton;
return singleton;
}
void registerA(const A& a) {
// whatever
}
};
class A {
A() { B::Instance().registerA(this); }
};
कैसे विनाशकर्ता सही पाने के लिए?
class A {
A() { B::Instance().registerA(this); }
~A() { B::Instance().signoffA(this); }
};
तो B
का नाशक A
का नाशक से पहले कहा जा सकता है: का उपयोग कर सकते हैं। फिर कक्षा A
का उदाहरण B
के एक नए नव निर्मित उदाहरण पर संकेत देता है।
file1.cc
#include "types.h"
namespace C {
A a;
}
file2.cc
#include "types.h"
namespace C {
A b;
}
मैं ऐसे कर सकते हैं पर लगता है:
परीक्षण का मामला एक नाम स्थान में class A
के उदाहरण की परिभाषा के साथ एक बहु स्रोत फ़ाइल सेटअप होगा बूस्ट स्मार्ट पॉइंटर्स के साथ आसानी से चीज। हालांकि, यदि संभव हो तो मैं निर्भरता को यथासंभव कम रखने के लिए अतिरिक्त पुस्तकालयों का उपयोग करना टालना चाहूंगा।
एक चीज जो मदद कर सकती है: सभी वैश्विक चर नामित नामस्थान में हैं।
कृपया अपना इंडेंटेशन और स्कोपिंग ठीक करें। –
इसके अलावा, कृपया यह वर्णन करने के लिए एक संक्षिप्त सुसंगत परीक्षण-केस बनाने पर विचार करें कि आपका 'ए' उदाहरण अन्य सभी चीज़ों के संबंध में कहां बनाया गया है। यह वर्तमान में थोड़ा उलझन में है। –
ध्यान दें कि 'रजिस्टर' सी ++ और सी में कीवर्ड है, और इस प्रकार आपका कोड संकलित नहीं होता है। –