es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

La instancia de shared_ptr no está establecida para un objeto como se esperaba.

Tengo una estructura A que tiene un miembro otra estructura C. Así que A con c1Ptr como miembro.
Uso 2 estructuras S y N. N tiene un miembro A, a_y S tiene un miembro C, c.
Después de instanciar A y crear un objeto c para S utilizando el objeto A creado y pasar el objeto A creado a N, esperaría tener A->c1Ptr en N también.
Gracias.

“`cpp
#include
#include
using namespace std;

struct C1
{
C1(int x):x_(x)
{
std::cout << “-C1: x_: ” << x_ << std::endl;
}
int x_;
~C1()
{
std::cout << “-DC1: x_: ” << x_ << std::endl;
}
};

using C1ptr = std::shared_ptr;

struct A
{
C1ptr c1Ptr;
};

struct S
{
S(C1ptr& c1Ptr):c1Ptr_(c1Ptr)
{

}
C1ptr c1Ptr_;

};

struct N
{
N(std::shared_ptr a):a_(a)
{

}
std::shared_ptr<a> a_;

};

int main()
{
std::shared_ptr
a = std::make_shared();
S s(a->c1Ptr);
N n(a);

s.c1Ptr_ = std::make_shared<c1>(12);

if (n.a_->c1Ptr)
{
    std::cout << "c1Ptr está configurado para N\n";
}
else
{
    std::cout << "c1Ptr NO está configurado para N\n"; // por qué c1Ptr no está configurado para n.a_ ? 
}

return 0;

}
“`

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Basándose en el código proporcionado, la expectativa es que A->c1Ptr_ también esté en N después de pasar el objeto A creado. Sin embargo, en el código dado, el miembro c1Ptr_ del objeto S se modifica después de crear el objeto N, y no se asigna al objeto A apuntado por n.a_. Por lo tanto, n.a_->c1Ptr permanece sin cambios.

    Para tener A->c1Ptr_ también en N después de pasar el objeto A creado, podemos modificar el código de la siguiente manera:

    int main()
    {
       std::shared_ptr<a> a = std::make_shared<a>();
       a->c1Ptr = std::make_shared<c1>(10); // asignar objeto C1 a A->c1Ptr
    
       S s(a->c1Ptr);
       N n(a);
    
       if (n.a_->c1Ptr)
       {
           std::cout<<"c1Ptr está configurado para N\n";
       }
       else
       {
           std::cout<<"c1Ptr NO está configurado para N\n"; 
       }
    
        return 0;
    }
    

    En este código modificado, primero asignamos un objeto C1 a A->c1Ptr. Luego creamos los objetos S y N utilizando el c1Ptr del objeto A. De esta manera, A->c1Ptr se propaga a los objetos S y N. Finalmente, verificamos si c1Ptr está configurado para el objeto A apuntado por n.a_. Dado que hemos asignado un objeto C1 a A->c1Ptr, la salida será “c1Ptr está configurado para N”.

Comments are closed.