在 const 成员函数中返回 C++ 引用

Posted

技术标签:

【中文标题】在 const 成员函数中返回 C++ 引用【英文标题】:Returning a C++ reference in a const member functions 【发布时间】:2010-05-19 01:26:09 【问题描述】:

一个类层次结构看起来像这样:

class AbstractDataType  
public: 
   virtual int getInfo() = 0;
; 

class DataType: public AbstractDataType  
public:
   virtual int getInfo()  ; 
;

class Accessor  
    DataType data; 
public: 
    const AbstractDataType& getData() const  
        return(data); 
     
;

好吧,GCC 4.4 报告:

在成员函数‘const AbstractDataType& Accessor::getData() const’中: 错误:从“const DataType”类型的表达式中对“const AbstractDataType&”类型的引用进行无效初始化

我哪里出错了 - 这是我必须使用指针的情况吗?

[编辑 - 固定分号]

【问题讨论】:

我看不出该代码有什么问题,Comeau 和 Visual C++ 2010 都接受了它(只需进行一些小改动即可使其编译)。 在 g++ 4.2.4 上工作(以你的类 decls 中缺少的分号为模) 除了每个类定义后缺少分号外,没有任何问题。它应该可以正常编译。 【参考方案1】:

不,您不需要使用指针。在这种情况下,您可以平等地使用引用或指针。

您粘贴的代码应该可以在 g++ 4.4 和 Visual Studio 2010.... 中运行,但类声明后缺少分号。

我猜你的代码可能与你正在编译的代码不完全匹配。

特别是您是否不小心在代码中这样做了?

class DataType /*: public AbstractDataType*/  
public:
   virtual int getInfo()  ; 
;

【讨论】:

是的,我确实确实忘记了继承 AbstractDataType。天哪,真是个新手错误。 :-/ @Chris:每个人都会发生一次或多次【参考方案2】:

我没有要测试的 GCC 副本,但问题可能是围绕数据的括号。编译器可能会将其解释为 DataType 类型的表达式,然后您无法将其分配给引用。试试:

return data;

【讨论】:

以上是关于在 const 成员函数中返回 C++ 引用的主要内容,如果未能解决你的问题,请参考以下文章

C++ const 修饰符

C++ 成员引用基类型'Vertex *const'不是结构或联合

如何在 const 成员函数中使用非常量成员函数?

c++初始化函数列表

C++点滴----关于类常成员函数

测试页面