【问题标题】:Using references to access class objects C++使用引用访问类对象 C++
【发布时间】:2013-11-18 16:06:49
【问题描述】:

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

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 变量必须在构造函数基/成员初始化列表等中初始化...

如果看起来我正在尝试做一些我完全清楚如何做的事情,那肯定是这样!任何帮助将非常感激。

【问题讨论】:

标签: c++ inheritance reference addressing


【解决方案1】:

这就是你出错的地方

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)
{
}

【讨论】:

  • 具体来说,他们出错的地方是没有初始化引用。第一个代码示例中的行将是有效的,但它不会执行 OP 所期望的。
  • 感谢您的反馈。在 CClassWrap::CClassWrap( const CClass& AppIfx ) : PlotArgs( AppIfx.PlotArgs ) AppIfx 在 PlotArgs( AppIfx.PlotArgs ) 中无法被编译器识别
  • 它给出了一个 C2440..conversion lost qualifiers
  • 取出 consts,因为需要修改 PlotArgs 以移除 C2440。
  • 好吧,考虑到语言需要设置引用和其他因素的方式,我将不得不寻找其他方法来完成我需要的事情。但这是一个完整的答案,所以我这样标记它。谢谢!
猜你喜欢
  • 1970-01-01
  • 2021-12-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多