How to approach copying objects with smart pointers as class attributes?
        Posted  
        
            by 
                tomislav-maric
            
        on Stack Overflow
        
        See other posts from Stack Overflow
        
            or by tomislav-maric
        
        
        
        Published on 2012-12-17T10:26:28Z
        Indexed on 
            2012/12/17
            11:03 UTC
        
        
        Read the original article
        Hit count: 263
        
From the boost library documentation I read this:
Conceptually, smart pointers are seen as owning the object pointed to, and thus responsible for deletion of the object when it is no longer needed.
I have a very simple problem: I want to use RAII for pointer attributes of a class that is Copyable and Assignable.
The copy and assignment operations should be deep: every object should have its own copy of the actual data. Also, RTTI needs to be available for the attributes (their type may also be determined at runtime).
Should I be searching for an implementation of a Copyable smart pointer (the data are small, so I don't need Copy on Write pointers), or do I delegate the copy operation to the copy constructors of my objects as shown in this answer?
Which smart pointer do I choose for simple RAII of a class that is copyable and assignable? (I'm thinking that the unique_ptr with delegated copy/assignment operations to the class copy constructor and assignment operator would make a proper choice, but I am not sure)
Here's a pseudocode for the problem using raw pointers, it's just a problem description, not a running C++ code:
// 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 work for it, 
        // as soon as it goes out of scope.  
        MyModel modelTwo (modelOne); 
    }
    return 0;
}
© Stack Overflow or respective owner