Вы хотите передать и передать копию в контейнер.

:: shared_ptr действительно беспокоит меня. Конечно, я понимаю полезность такой вещи, но я хотел бы, чтобы я мог использоватьshared_ptr<A> как A*, Рассмотрим следующий код

class A
{
public:
    A() {}
    A(int x) {mX = x;}
    virtual void setX(int x) {mX = x;}
    virtual int getX() const {return mX;}
private:
    int mX;
};


class HelpfulContainer
{
public:
    //Don't worry, I'll manager the memory from here.
    void eventHorizon(A*& a)
    {
        cout << "It's too late to save it now!" << endl;
        delete a;
        a = NULL;
    }
};


int main()
{
    HelpfulContainer helpfulContainer;

    A* a1 = new A(1);
    A* a2 = new A(*a1);
    cout << "*a1 = " << *a1 << endl;
    cout << "*a2 = " << *a2 << endl;
    a2->setX(2);
    cout << "*a1 = " << *a1 << endl;
    cout << "*a2 = " << *a2 << endl;
    cout << "Demonstrated here a2 is not connected to a1." << endl;

    //hey, I wonder what this event horizon function is.
    helpfulContainer.eventHorizon(a1);

    cout << "*a1 = " << *a1 << endl;//Bad things happen when running this line.
}

Кто бы ни создал HelpfulContainer, он не думал о других, желающих сохранить указатели на объекты A. Мы не можем предоставить объекты HelpfulClass boost :: shared_ptr. Но одну вещь, которую мы могли бы сделать, это использовать идиому pimlp для создания SharedA, который сам по себе является A:

class SharedA : public A
{
public:
    SharedA(A* a) : mImpl(a){}
    virtual void setX(int x) {mImpl->setX(x);}
    virtual int getX() const {return mImpl->getX();}
private:
    boost::shared_ptr<A> mImpl;
};

И тогда основная функция может выглядеть примерно так:

int main()
{
    HelpfulContainer helpfulContainer;

    A* sa1 = new SharedA(new A(1));
    A* sa2 = new SharedA(sa1);
    cout << "*sa1 = " << *sa1 << endl;
    cout << "*sa2 = " << *sa2 << endl;
    sa2->setX(2);
    cout << "*sa1 = " << *sa1 << endl;
    cout << "*sa2 = " << *sa2 << endl;
    cout << "this demonstrates that sa2 is a shared version of sa1" << endl;

    helpfulContainer.eventHorizon(sa1);
    sa2->setX(3);
    //cout << "*sa1 = " << *sa1 << endl;//Bad things would happen here
    cout << "*sa2 = " << *sa2 << endl; 
    //but this line indicates that the originally created A is still safe and intact.
    //only when we call sa2 goes out of scope will the A be deleted.
}

Итак, мой вопрос заключается в следующем: Является ли приведенный выше шаблон хорошим шаблоном, или я что-то еще не рассматриваю? Мой текущий проект унаследовалHelpfulContainer Класс, как указано выше, удаляет нужные мне указатели, но мне все еще нужна структура данных, представленная в HelpfulContainer.

Обновление: этовопрос это дополнительный вопрос.

Ответы на вопрос(4)

Ваш ответ на вопрос