C ++ 11 Преобразовать традиционный указатель в умный указатель.Использование современных SVN Clang и libc ++ от llvm - PullRequest
2 голосов
/ 12 марта 2012

У меня есть функция внутри класса (A), которая по существу принимает в качестве параметра указатель на другой класс (B).Класс B наследуется несколькими другими классами, которые он также должен принимать.

Что я хотел бы сделать, это взять на себя владение этим указателем для хранения для дальнейшего использования в классе, он не будет использоваться внеснова класс для всего остального.Хотя я бы сделал параметр shared_ptr, я бы хотел избежать этого, насколько это возможно, из-за других людей, с которыми я работаю, которые не совсем понимают, что такое умный указатель.Есть какой-либо способ сделать это?

Вот пример, который я хотел бы сделать, хотя из того, что я тестировал, это не работает.

//In .h file
std::vector< unique_ptr< B > > data_store;

//In .cpp file
void A::add_data(B* NewItem)
{
    data_store.resize(data_store.size()+1);
    data_store[data_store.size()-1] = NewItem;
}

Во-вторых, я хотел бы, возможно, использоватьконструктор копирования или что-то подобное, чтобы использовать умный указатель внутри класса: с тем, что мне нужно сделать, это может стать немного уродливым, если мне придется выполнять ручное удаление.Проблема в том, что я не знаю, входит ли это базовый класс (B) или это класс, унаследованный от B. Я не слишком уверен, как с этим справиться, не прибегая к жесткому коду в некоторыхвид проверяемого идентификатора для класса и использование правильных конструкторов копирования / перемещения, которых я хотел бы избежать любой ценой.

Я использую обновленный Clang и libC ++ от llvm, которые я обновил около 10:00 по британскому времени12 марта 2012 года.

Ответы [ 2 ]

4 голосов
/ 12 марта 2012

Для любого указателя, который не должен использоваться совместно, класс является единственным владельцем std::unique_ptr<T>. Он автоматически удалит указатель, когда владелец объекта выходит из области видимости / удаляется. Я бы вообще не советовал использовать для этого общий указатель, так как он сообщал бы другим разработчикам, что этот участник должен быть общим.

Так что для копирования. Поскольку у вас есть указатель на объект, который может иметь подклассы, вам нужно использовать идиому clone вместо обычного конструктора копирования. Обычно это реализуется с помощью виртуальной функции clone, которая возвращает указатель (или умный указатель) на класс. Это требует, чтобы все подклассы переопределили это, возвращая копию себя.

class Base {
    ...
    virtual std::unique_ptr<Base> clone() const = 0;
    ...
};

class Subclass {
    ...
    virtual std::unique_ptr<Base> clone() const {
        return std::unique_ptr<Base>(new Subclass(*this));
    }
};

Если объект-владелец имеет конструктор копирования, он должен будет вызывать эту функцию-клон для объекта, которым он владеет, при создании своей копии.

0 голосов
/ 12 марта 2012

Если вы хотите создать объект, которому принадлежит вектор указателей, вы должны использовать boost :: vector_ptr.Он автоматически удаляет все содержащиеся в нем объекты

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...