2011-02-10 5 views
0

C++ У меня есть функция, которая делает это:указатель Pass для auto_ptr с

static MyClass* MyFunction(myparams) 
{ 
    return new MyClass(myparams) 
} 

и я мог бы вызвать эту функцию внутри другой, который имеет следующую подпись:

void MyFunction2(std::auto_ptr<MyClass> myparam) 

но когда я пытаюсь это сделать, у меня есть ошибка компилятора:

Impossible to convert the first param from MyClass * to std::auto_ptr<_Ty>

Почему? Спасибо за любую помощь

EDIT 1 Как спросили типы myparams являются нормальными, но есть и T пары, так как функция находится внутри шаблона класса

+2

Каков тип myparams в MyFunction, в этом вопросе отсутствует. –

+0

Вы понимаете цель 'auto_ptr'? – Cascabel

+0

@ Эрик Я добавил типы myparams. @Jefromi Да, я понимаю, что auto_ptr позволяет мне не думать об уничтожении указателя и освобождении памяти – Stefano

ответ

9

std::auto_ptr<> имеет явный конструктор, как и любой другой умный указатель. Это означает, что нет никакого неявного преобразования от T* до std::auto_ptr<T>, чтобы предотвратить случайное удаление объекта. Следовательно, вам нужно преобразовать ваше сырье указал std::auto_ptr<> явно:

MyFunction2(std::auto_ptr<MyClass>(MyFunction())); 

Это также хорошая идея, чтобы сделать ваши фабричные функции возвращают смарт-указатель вместо исходного указателя, он дает понять читателю, что право собственности от объекта передается вызывающему абоненту:

static std::auto_ptr<MyClass> MyFunction(myparams) 
{ 
    return std::auto_ptr<MyClass>(new MyClass(myparams)); 
} 
+0

спасибо, он работает – Stefano

0

Там нет неявного преобразования из исходного указателя на auto_ptr. Просто явно назвать это:

MyFunction2(std::auto_ptr(MyFunction(params)));

Обратите внимание, что выделенная memoty будет уничтожена после вызова MyFunction2, поскольку временный auto_ptr пропадет, deallocating его.

0

Вы можете вызвать функцию MyFunction2 как это ...

void f() { 
    MyClass* directptr = MyFunction(myparams); 
    std::auto_ptr<MyClass> p(directptr); 
    MyFunction2(p); 
    cout << p.get() << endl; // Prints NULL! 
} 

Ho wever, когда MyFunction2 заканчивается, экземпляр MyClass будет удален, а после сохранения p будет NULL, а directptr укажет на удаленный объект.

Смежные вопросы