Frage

Dieser hat mich ratlos gemacht.Ich versuche, eine Referenzvariable in einer Wrapper-Klasse dazu zu bringen, auf ein Struktobjekt in der Klasse zu verweisen, die es umschließt, sodass alle Einstellungen von Variablen in der Struktur aus anderen Klassen, die die Wrapper-Klasse verwenden, tatsächlich in der Struktur festgelegt werden umschlossene Klasse, nicht die Wrappper-Klasse.Dazu habe ich versucht, einfach einen Verweis in der Wrap-Klasse auf die Struktur in der Wrapped-Klasse zu erstellen, z

class CClassWrap
{
    CClass::plot_type& PlotArgs;  
}  

und dann initialisiere PlotArgs

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

Ich möchte nur, dass PlotArgs auf die PlotArgs der umschlossenen Klasse zeigen, damit beim Zugriff auf PlotArgs Folgendes gesagt wird

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

 }

12 wird in der umschlossenen Klassenversion von PlotArgs angezeigt.Dazu habe ich versucht, eine in der definierte Referenz festzulegen.h-Datei wie folgt

#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 wird in einer anderen Klasse geerbt, nennen Sie es StudiesBase

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

Wenn dies kompiliert wird, wird ein Fehler ausgegeben, der besagt, dass für CClassWrap kein Standard-Ctor vorhanden ist.Also füge ich einen Ctor hinzu

so dass CClassWrap jetzt so aussieht

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

Dies erzeugt einen Fehler C2758, der besagt, dass PlotArgs nicht initialisiert ist.

Also versuche ich im Ctor für ClassWrap, es zu initiieren.

PlotArgs = AppIfx.PlotArgs;

wobei AppIfx zur Laufzeit als Zeiger auf das CClass Objekt gesetzt wird.Dem Compiler gefällt das auch nicht mit dem Fehler C2758 Variable muss in der Konstruktorbasis- / Memberinitialisierungsliste usw. initialisiert werden...

Wenn es so aussieht, als würde ich versuchen, etwas zu tun, bei dem mir völlig klar ist, wie es geht, wäre das definitiv der Fall!Jede Hilfe wäre sehr dankbar.

War es hilfreich?

Lösung

Hier bist du falsch gelaufen

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

sie können eine Referenz nicht erneut binden.Sobald sich ein Verweis auf etwas bezieht, kann er niemals auf etwas anderes bezogen werden.Dieser Code (wenn Sie ihn ausgeführt haben) würde zuweisen AppIfx.PlotArgs zu was auch immer PlotArgs bezug genommen, das ist eindeutig nicht das, was Sie beabsichtigt haben.

Sie müssen diesen Code in den Konstruktor verschieben

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

Beachten Sie jedoch auch, dass dieser Konstruktorcode das CClass Objekt kopiert, sodass es möglicherweise nicht das tut, was Sie erwarten (möglicherweise verweisen Sie auf ein kopiertes PlotArgs Objekt, obwohl dies davon abhängt, wie der CClass Kopierkonstruktor funktioniert).Daher ist es wahrscheinlich besser, auch hier eine Referenz zu verwenden

CClassWrap::CClassWrap( CClass& AppIfx ) : PlotArgs(AppIfx.PlotArgs)
{
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top