Pregunta

Este me tiene perplejo.Lo que estoy tratando de hacer es obtener una variable de referencia en una clase contenedora para que apunte a un objeto de estructura en la clase que envuelve, de modo que cualquier configuración de variables en la estructura de otras clases que usan la clase contenedora, en realidad se establezca en el clase envuelta, no la clase contenedora.Para hacer esto, intenté simplemente crear una referencia en la clase envuelta a la estructura en la clase envuelta como

class CClassWrap
{
    CClass::plot_type& PlotArgs;  
}  

y luego inicia PlotArgs

CClassWrap::InitWrap( CClass AppIfx )
{
    PlotArgs = AppIfx.PlotArgs;
}

Solo quiero que PlotArgs apunte a los PlotArgs de la clase envuelta para que cuando se acceda a PlotArgs desde diga esto

class StudiesBase:public CClassWrap
{
   //12 should show up in CClass because PlotArgs in CClassWrap points to the PlotArgs on CClass.
   PlotArgs.value = 12;

 }

12 aparece en la versión de clases empaquetadas de PlotArgs.Para hacer esto, intenté configurar una referencia definida en el archivo .h de la siguiente manera

#include "CClass.h"

class CClassWrap
{
 //PlotArgs is a struct with a few vars in it (int, long, etc.) that exists in CClass
 CClass::plot_type& PlotArgs;  
}

CClassWrap se hereda en otra clase, llámela StudiesBase

class StudiesBase:: public CClassWrap
{
     etc...
}

Cuando se compila esto, aparece un error que indica que no existe un ctor predeterminado para CClassWrap.Entonces agrego un Ctor

tal que CClassWrap ahora parece

class CClassWrap
{
public:
      CClassWrap();
public:
     //PlotArgs is a struct with a few vars in it (int, long, etc.) that exists in CClass
     CClass::plot_type& PlotArgs;  
}

Esto genera un error C2758 que dice que PlotArgs no está inicializado.

Entonces, en el ctor de ClassWrap intento iniciarlo.

PlotArgs = AppIfx.PlotArgs;

donde AppIfx se configura en tiempo de ejecución como un puntero al objeto CClass.Al compilador tampoco le gusta que con el error C2758 la variable deba inicializarse en la lista de inicializadores de miembros/base del constructor, etc.

Si parece que estoy tratando de hacer algo que tengo totalmente claro cómo hacerlo, ¡definitivamente ese sería el caso!Cualquier ayuda sería muy apreciada.

¿Fue útil?

Solución

Aquí es donde te equivocaste

CClassWrap::InitWrap( CClass AppIfx )
{
    PlotArgs = AppIfx.PlotArgs;
}

no se puede volver a vincular una referencia.Una vez que una referencia se refiere a algo, nunca se puede hacer que se refiera a otra cosa.Este código (si lo ejecutara) asignaría AppIfx.PlotArgs a lo que sea PlotArgs mencionado, claramente eso no es lo que pretendías.

Debes mover este código al constructor.

CClassWrap::CClassWrap( CClass AppIfx ) : PlotArgs(AppIfx.PlotArgs)
{
}

Pero también tenga en cuenta que este código de constructor copia el objeto CClass, por lo que es posible que no haga lo que espera (podría terminar haciendo referencia a un objeto PlotArgs copiado, aunque eso depende de cómo funciona el constructor de copia de CClass).Entonces probablemente sea mejor usar una referencia aquí también.

CClassWrap::CClassWrap( CClass& AppIfx ) : PlotArgs(AppIfx.PlotArgs)
{
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top