2010-10-20 65 views
1

这是问题所在。我写了这个函数来返回一个对成员向量的i元素的引用,所以这个元素可以被编辑。下面是代码:如何编写一个返回对成员对象引用的const访问器,以便它可以被编辑?

Letter& Literal::get (int i) const { 

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

但G ++不会让我这个元素赋值给一个非const引用:

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’ 

怎么可能解决呢?我的想法是建立一个像vector的at()函数那样的函数,所以它会是const的,因为它不会编辑对象本身,但是它应该让我编辑返回的对象......可能吗?

解决:我只是重载函数:),所以声明一个const和一个非const版本。我担心const和non-const重载是不允许的,但是我看到const改变了参数列表,使得它成为可能。

回答

5

问题是这样的成员函数:

Letter& get (int i) const 

你宣布为const,并且因为,Vector类的

const T& at() const 

成员函数被调用时,返回你常量参考第i项,因此您不能修改它。

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

顺便说一下,您声明了函数const,并且您返回的是非const引用。

0

这不是常量正确的。你正在改变这个类的成员变量(矢量),所以g ++将这看作是一个错误。当您将方法声明为const并返回成员变量时,期望返回的值用于inspection而不是mutation

2

有一个非常好的理由为什么会产生错误。你的班级的目标应该是不变的以保持其状态。当你返回一个内部变量的引用时,你允许某人改变该内部变量的值,从而改变对象的状态,使其不再是一个常量函数。

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

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

大概的文章大家处理指针应阅读(或任何语言允许const关键字,但10倍以上,所以如果指针都参与)可以发现here。老实说,我可能应该再看一遍自己。

+0

其实你已经给他解决方案。只要指针永远不会为NULL,您可以对其进行解引用。 – CashCow 2010-10-20 15:52:37

+0

我不确定它是否有效,因为我在考虑它是否是一个const方法,它可能实际上会返回'Letter * const'或'const Letter *',而在第二种情况下,他会处于相同的状态像以前一样。 – Anthony 2010-10-20 15:54:17