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?
#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
file
noa
. El ejemplo de Menos en realidad estaba usandoa
. De todos modos, gracias por aguantarme. He cambiado a esta sintaxis ahora.– punto net
17 de septiembre de 2015 a las 11:29
johnjohnlys
pienso animal.reset(new Animal(file))
es lo que quieres
-
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;
}
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 usarstd::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