Domanda

Questo mi ha stumptato. Quello che sto cercando di fare è ottenere una variabile di riferimento in una classe di wrapper per puntare a un oggetto strutturale nella classe che avvolge in modo che qualsiasi impostazione di variabili nella struttura da altre classi che utilizzano la classe wrapper, in realtà sono impostate in Classe avvolta non la classe wrapper. Per fare ciò ho provato a creare semplicemente un riferimento nella classe avvolgente alla struttura nella classe avvolta come

class CClassWrap
{
    CClass::plot_type& PlotArgs;  
}  
.

e quindi init platargs

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

Voglio solo che PloRaRgs puntino ai platargs della classe avvolta in modo che quando si accede a quando si accede a PloRaRgs da dire questo

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

 }
.

12 si presenta nella versione classificata delle classi avvolte di PloRaRGS. Per fare ciò ho provato a impostare un riferimento definito nel file .h come segue

#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 è ereditato in un'altra classe, chiamalo StudiesBase

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

Quando questo è compilato, viene assegnato un errore che non dice che nessun ciclo predefinito esiste per cclosswrap. Quindi aggiungo un ciclo

In tale che il cclosswrap è ora simile a

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;  
}
.

Genera un errore c2758 che dice che i platargs non è inizializzato.

Quindi nel CTOR per CLARWRAP, cerco di iniziare.

PlotArgs = AppIfx.PlotArgs;
.

Dove AppIfx è impostato in fase di runtime come puntatore sull'oggetto CCLASS. Il compilatore non piace che sia con l'errore della variabile C2758 deve essere inizializzato nell'elenco del costruttore / elenco di inizializzazione dei membri, ecc ...

Se sembra che sto cercando di fare qualcosa che sono totalmente chiaro su come farlo sarebbe sicuramente il caso! Qualsiasi aiuto sarebbe molto apprezzato.

È stato utile?

Soluzione

È qui che sei andato storto

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

Non è possibile ribellare un riferimento.Una volta che un riferimento si riferisce a qualcosa, non può mai essere fatto riferimento a qualcos'altro.Questo codice (se lo eseguito) assegnerebbe assegnare AppIfx.PlotArgs a qualsiasi generazione di PlotArgs si riferisca, non è chiaramente ciò che hai intenzione.

È necessario spostare questo codice nel costruttore

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

Ma nota anche che questo codice costruttore copia l'oggetto CCLASS, quindi potrebbe non fare ciò che ti aspetti (potresti finire, si fa riferimento a un oggetto Plorargs copiato, sebbene dipenda da come funziona il costruttore della copia CCLASS).Quindi è probabilmente meglio usare un riferimento anche qui

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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top