如何编写一个返回对成员对象的引用的 const 访问器,以便可以对其进行编辑?

Posted

技术标签:

【中文标题】如何编写一个返回对成员对象的引用的 const 访问器,以便可以对其进行编辑?【英文标题】:How do I write a const accessor that returns a reference to a member object, so it might be edited? 【发布时间】:2010-10-20 15:36:40 【问题描述】:

这就是问题所在。我编写了这个函数来返回对成员向量的 i 元素的引用,因此可以编辑这个元素。代码如下:

Letter& Literal::get (int i) const 

   return lit_m.at (i); //Vector of Letter objects

但是 g++ 不允许我将该元素分配给非常量引用:

g++ -o literal.o -c literal.cpp
literal.cpp: In member function ‘Letter& Literal::get(int) const’:
literal.cpp:34: error: invalid initialization of reference of type ‘Letter&’ from expression of type ‘const Letter’

如何解决?我的想法是建立一个像向量的 at() 函数这样的函数,所以它将是 const 因为它不编辑对象本身,但它应该让我编辑返回的对象......有可能吗?

已解决:我只需要重载函数:),所以声明一个 const 和一个非常量版本。我担心不允许 const 和非 const 重载,但我看到 const 改变了参数列表,使其成为可能。

【问题讨论】:

【参考方案1】:

问题是这个成员函数:

Letter& get (int i) const

你将它声明为 const,正因为如此,

const T& at() const

vector类的成员函数被调用,返回给你第i项的const引用,所以你不能修改它。

如果您确实需要修改该元素,请不要将您的 get() 函数声明为 const,并像现在一样返回对该元素的引用。

顺便说一句,您声明了函数 const,并且您正在返回非 const 引用。

【讨论】:

【参考方案2】:

这会产生错误是有充分理由的。您的类的对象应该是常量以保持其状态。当您返回对其内部变量之一的引用时,您允许某人更改该内部变量的值,从而更改对象的状态,使其不再是一个常量函数。

如果 Literal 类包含指向 Letter 对象而不是 letter 对象的指针向量,则可能的情况是,您可以成功地将指针返回到其中一个 Letter 对象而不会出现问题。

Letter* Literal::get (int i) const 
   return lit_m.at (i); //Vector of pointers to Letter objects  
 

可能每个处理指针的人都应该阅读的文章(或任何允许 const 关键字的语言,但如果涉及指针,则要多 10 倍)可以找到 here。老实说,我可能应该自己再看一遍。

【讨论】:

其实你已经给他解决了。只要指针永远不会为 NULL,您就可以取消引用它。 我不确定它是否有效,因为我在想如果它是一个 const 方法,它实际上可能会返回 Letter* constconst Letter* 在第二种情况下,他会和以前一样。【参考方案3】:

这不是 const 正确的。您正在更改类的成员变量(向量),因此 g++ 将其视为错误。当您将方法声明为 const 并返回成员变量时,期望返回的值用于 inspection 而不是 mutation

【讨论】:

以上是关于如何编写一个返回对成员对象的引用的 const 访问器,以便可以对其进行编辑?的主要内容,如果未能解决你的问题,请参考以下文章

返回对临时对象成员的 const 引用

为啥要返回对小类成员的 const 引用?

为啥 const 方法不能返回非常量引用?

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

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

测试页面