Cómo inicializar un unique_ptr

3 minutos de lectura

Estoy tratando de agregar una función de inicialización diferida a mi clase. No soy muy competente con C++. ¿Puede alguien decirme cómo lo logro?

Mi clase tiene un miembro privado definido como:

std::unique_ptr<Animal> animal;

Aquí está el constructor original que toma un parámetro:

MyClass::MyClass(string file) :
animal(new Animal(file))
{}

Acabo de agregar un constructor sin parámetros y una función Init(). Aquí está la función Init que acabo de agregar:

void MyClass::Init(string file)
{
    this->animal = ???;
}

¿Qué necesito escribir allí para que sea equivalente a lo que está haciendo el constructor?

  • Usar std::make_unique<Animal>(file) en la lista de inicializadores de miembros.

    – πάντα ῥεῖ

    17 de septiembre de 2015 a las 6:51


  • Ejemplo sencillo: es.cppreference.com/w/cpp/memory/unique_ptr

    – cbinder

    17 de septiembre de 2015 a las 6:53

  • Para ??? puedes usar std::make_unique<Animal>(file).

    –David Schwartz

    17 de septiembre de 2015 a las 7:01

  • @dotNet C++ es un lenguaje complejo con muchas capas, partes buenas y malas. Si no eres muy hábil con C++, puedes echar un vistazo a isocpp.org/recorrido. Es una introducción a C++ con C++ moderno. Si desea omitir la introducción, obtenga copias de la serie Eficaz C++.

    – Jens

    17 de septiembre de 2015 a las 7:14

#include <memory>
#include <algorithm>
#include <iostream>
#include <cstdio>

class A
{
public :
    int a;
    A(int a)
    {
        this->a=a;

    }
};
class B
{
public :
    std::unique_ptr<A> animal;
    void Init(int a)
    {
        this->animal=std::unique_ptr<A>(new A(a));
    }
    void show()
    {
        std::cout<<animal->a;
    }
};

int main()
{
    B *b=new B();
    b->Init(10);
    b->show();
    return 0;
}

  • ¿Es lo mismo que hacer make_unique como lo sugirió otro amigo?

    – punto net

    17 de septiembre de 2015 a las 7:00

  • Mejor es probablemente this->animal = std::make_unique<A>(a);

    –David Schwartz

    17 de septiembre de 2015 a las 7:00

  • Es lo mismo. El mío es más tonto, creo.

    – Menos

    17 de septiembre de 2015 a las 7:15

  • @DavidSchwartz: me dice que estoy “intentando hacer referencia a una función eliminada” cuando escribo animal = std::make_unique<Animal>(Animal(file));.

    – punto net

    17 de septiembre de 2015 a las 7:18


  • @DavidSchwartz: Dios mío. De repente, todo quedó claro. Sintiéndome tan tonto. La confusión fue causada por el hecho de que mi parámetro fue nombrado fileno a. El ejemplo de Menos en realidad estaba usando a. De todos modos, gracias por aguantarme. He cambiado a esta sintaxis ahora.

    – punto net

    17 de septiembre de 2015 a las 11:29

avatar de usuario
johnjohnlys

pienso animal.reset(new Animal(file)) es lo que quieres

http://en.cppreference.com/w/cpp/memory/unique_ptr/reset

  • Mucho más corto que otras variantes y funcionando. ¡Gracias!

    – Melebio

    17 de junio de 2020 a las 9:33

#include<iostream>
#include<memory>
#include<iostream>

class Amm{

    public:
    std::unique_ptr<double> myVar;
    explicit Amm(std::unique_ptr<double> ptr):myVar{ptr.release()}{}
};

int main(){
    Amm a(std::make_unique<double>(5));
    std::cout<<*a.myVar;

    return 0;

}

¿Ha sido útil esta solución?