这个让我难过。我正在尝试做的事情是在包装器类中获取一个引用变量,以指向它包装的类中的结构对象,这样,其他使用包装器类的类中的结构体中的任何变量设置实际上都在包装类,而不是包装类。为此,我尝试在wrap类中创建对包装类中的结构的引用,例如

class CClassWrap
{
    CClass::plot_type& PlotArgs;
}


然后初始化PlotArgs

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


我只希望PlotArgs指向包装的类的PlotArgs,这样当从中访问PlotArgs时,这样

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

 }


图12显示了PlotArgs的包装类版本。为此,我尝试如下设置.h文件中定义的引用

#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继承于另一个类,称为StudiesBase

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


编译此文件时,将给出错误消息,指出CClassWrap不存在默认ctor。所以我加了一个Ctor

这样CClassWrap现在看起来像

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


这将生成错误C2758,表明未初始化PlotArgs。

因此,在ClassWrap的ctor中,我尝试将其初始化。

PlotArgs = AppIfx.PlotArgs;


其中AppIfx在运行时设置为指向CClass对象的指针。编译器不喜欢这样,错误C2758变量必须在构造函数库/成员初始化器列表等中初始化...

如果看来我正在尝试做某事,而我对如何做完全清楚,那肯定是事实!任何帮助将非常感激。

最佳答案

这是你出问题了

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


您无法重新绑定参考。一旦引用指向某物,就永远无法使其引用另一物。这段代码(如果执行了)会将AppIfx.PlotArgs分配给PlotArgs所引用的内容,这显然不是您想要的。

您必须将此代码移到构造函数中

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


但也请注意,此构造函数代码复制了CClass对象,因此它可能无法达到您的期望(您可能最终引用复制的PlotArgs对象,尽管这取决于CClass复制构造函数的工作方式)。所以最好在这里使用参考

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

关于c++ - 使用引用访问类对象C++,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/20052288/

10-12 21:30