boost library documentation से मैं इस पढ़ें:क्लाइंट गुणों के रूप में स्मार्ट पॉइंटर्स के साथ ऑब्जेक्ट कॉपी करने के लिए कैसे संपर्क करें?
वैचारिक रूप से, स्मार्ट संकेत वस्तु के मालिक के रूप में देखा जाता है करने के लिए, और इस तरह वस्तु का विलोपन के लिए जिम्मेदार बताया है जब यह नहीं रह गया है की जरूरत है।
मुझे एक बहुत ही सरल समस्या है: मैं एक वर्ग के पॉइंटर विशेषताओं के लिए आरएआईआई का उपयोग करना चाहता हूं जो कॉपी करने योग्य और असाइन करने योग्य है।
कॉपी और असाइनमेंट ऑपरेशन गहरा होना चाहिए: प्रत्येक ऑब्जेक्ट में वास्तविक डेटा की अपनी प्रति होना चाहिए। इसके अलावा, आरटीटीआई को विशेषताओं के लिए उपलब्ध होना आवश्यक है (उनका प्रकार रनटाइम पर भी निर्धारित किया जा सकता है)।
चाहिए मैं एक प्रतिलिपि बनाने योग्य स्मार्ट सूचक के एक कार्यान्वयन के लिए खोज (डेटा छोटे हैं, इसलिए मैं Copy on Write संकेत की जरूरत नहीं है), या के रूप में this answer में दिखाया गया है मैं अपने वस्तुओं के प्रति निर्माताओं के प्रति आपरेशन प्रतिनिधि करते हो ?
मैं कौन सा स्मार्ट सूचक एक वर्ग के सरल आरएआईआई के लिए चुनता हूं जो कॉपी करने योग्य और असाइन करने योग्य है? (मैं सोच रहा हूँ कि वर्ग प्रति निर्माता और असाइनमेंट ऑपरेटर को प्रत्यायोजित कॉपी/काम से संचालित होने वाले unique_ptr एक उचित विकल्प बनाने होगा, लेकिन मुझे यकीन है कि नहीं कर रहा हूँ)
यहाँ कच्चे संकेत का उपयोग कर समस्या के लिए एक स्यूडोकोड है, यह सिर्फ एक समस्या विवरण, नहीं एक चल सी ++ कोड है:
// Operation interface
class ModelOperation
{
public:
virtual void operate =();
};
// Implementation of an operation called Special
class SpecialModelOperation
:
public ModelOperation
{
private:
// Private attributes are present here in a real implementation.
public:
// Implement operation
void operate() {};
};
// All operations conform to ModelOperation interface
// These are possible operation names:
// class MoreSpecialOperation;
// class DifferentOperation;
// Concrete model with different operations
class MyModel
{
private:
ModelOperation* firstOperation_;
ModelOperation* secondOperation_;
public:
MyModel()
:
firstOperation_(0),
secondOperation_(0)
{
// Forgetting about run-time type definition from input files here.
firstOperation_ = new MoreSpecialOperation();
secondOperation_ = new DifferentOperation();
}
void operate()
{
firstOperation_->operate();
secondOperation_->operate();
}
~MyModel()
{
delete firstOperation_;
firstOperation_ = 0;
delete secondOperation_;
secondOperation_ = 0;
}
};
int main()
{
MyModel modelOne;
// Some internal scope
{
// I want modelTwo to have its own set of copied, not referenced
// operations, and at the same time I need RAII to for the operations,
// deleting them automatically as soon as it goes out of scope.
// This saves me from writing destructors for different concrete models.
MyModel modelTwo (modelOne);
}
return 0;
}
यदि आप [shared_ptr'] का विवरण पढ़ते हैं (http://www.boost.org/doc/libs/1_52_0/libs/smart_ptr/shared_ptr.htm) तो आप देखेंगे कि वे प्रतिलिपि बनाने योग्य और असाइन करने योग्य हैं। –
@ जोचिम हां, bu वे एक ही वस्तु का संदर्भ साझा करते हैं। मुझे एक गहरी प्रतिलिपि करने के लिए कॉपी ऑपरेशन की आवश्यकता है। – tmaric
किसी भी विकल्प पर किसी भी स्मार्ट सूचक का उपयोग नहीं कर रहा है? –