À l'aide de références pour accéder à des objets de la classe C++
-
26-12-2019 - |
Question
Cela m'a déconcerté.Ce que j'essaie de faire est d'obtenir une variable de référence dans une classe wrapper pour pointer vers une struct objet dans la classe qu'il l'enveloppe de sorte que n'importe quel paramètre de variables dans la structure à partir d'autres classes qui utilisent la classe wrapper, sont en fait situé dans le enveloppés classe pas les wrappper classe.Pour ce faire, j'ai essayé de créer simplement une référence dans le film de la classe de la structure dans la enveloppé classe comme
class CClassWrap
{
CClass::plot_type& PlotArgs;
}
et puis init PlotArgs
CClassWrap::InitWrap( CClass AppIfx )
{
PlotArgs = AppIfx.PlotArgs;
}
Je veux juste PlotArgs à point pour le enveloppés de la classe de PlotArgs de sorte que lorsque PlotArgs est accessible à partir de dire ce
class StudiesBase:public CClassWrap
{
//12 should show up in CClass because PlotArgs in CClassWrap points to the PlotArgs on CClass.
PlotArgs.value = 12;
}
12 s'affiche dans la enveloppé classes version de PlotArgs.Pour ce faire, j'ai essayé définition d'une référence défini dans l' .h fichier comme suit
#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 est héritée dans une autre classe, de l'appeler StudiesBase
class StudiesBase:: public CClassWrap
{
etc...
}
Lorsque cela est compilé, une erreur est donnée à dire non par défaut ctor existe pour CClassWrap.J'ai donc ajouter un Ctor
tels que CClassWrap ressemble maintenant
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;
}
Cela génère une erreur C2758 dire que PlotArgs n'est pas inititlaized.
Ainsi, dans le ctor pour ClassWrap j'essaie d'init elle.
PlotArgs = AppIfx.PlotArgs;
où AppIfx est définie au moment de l'exécution comme un pointeur vers l'CClass de l'objet.Le compilateur n'aime pas que ce soit avec l'erreur C2758 variable doit être initialzied dans le constructeur de base/membre de l'initialiseur de liste, etc...
Si il semble que je suis en train de faire quelque chose que je suis totalement clair sur la façon de faire qui serait certainement le cas!Toute aide serait grandement appréciée.
La solution
C'est où vous êtes allé mal
CClassWrap::InitWrap( CClass AppIfx )
{
PlotArgs = AppIfx.PlotArgs;
}
vous ne pouvez pas relier une référence.Une fois une référence se réfère à quelque chose, il ne peut jamais être fait pour se référer à quelque chose d'autre.Ce code (si vous avez exécuté) à attribuer AppIfx.PlotArgs
quelle que soit PlotArgs
référencé, c'est clairement pas ce que vous souhaitiez.
Vous devez déplacer ce code dans le constructeur
CClassWrap::CClassWrap( CClass AppIfx ) : PlotArgs(AppIfx.PlotArgs)
{
}
Mais notez également que ce code constructeur de copie l'CClass de l'objet, de sorte qu'il ne pourrait pas faire ce que vous attendez (vous risquez de vous retrouver en référence à un copié PlotArgs objet, bien que cela dépende de la façon dont l'CClass constructeur de copie d'œuvres).Donc, il est probablement préférable d'utiliser une référence ici
CClassWrap::CClassWrap( CClass& AppIfx ) : PlotArgs(AppIfx.PlotArgs)
{
}