2010-05-21 39 views
4
void foo(const ClassName &name) 
{ 
    ... 
} 

如何访问类实例名的方法?通过类的const引用

name.method()没有工作。那么我试过了:

void foo(const ClassName &name) 
{ 
    ClassName temp = name; 
    ... .... 
} 

我可以使用temp.method,但在foo执行后,原来的名字搞砸了,有什么想法吗? BTW,名称的成员变量没有搞砸,但是它是类的子类的成员变量。

+0

这将有助于了解有关正在传入的类的信息。 – 2010-05-21 08:36:54

回答

4

如果我理解正确,你想在foo()里面调用name.method(),编译器不会让你。难道ClassName::method()是一种非const方法吗?由于name被声明为const参数foo(),因此您只能调用const函数。

更新:如果ClassName::method()是非常量,但实际上并没有改变状态,最好是当然的,使其const。如果你因为某些原因,我看到了以下几种方式:

  • (明显的方式,如@Naveen指出的 - 感谢:-)声明name作为一个非const方法的参数。
  • 制作name的非常量副本,并调用method就可以了 - 就像你实际做的那样。但是,只有在赋值运算符和/或复制构造函数适用于ClassName的情况下才有效。然而,你写了“foo被执行后,原来的名字搞砸了”,这是一个非常模糊的描述,但它可以被解释为复制在name上有一些不需要的副作用,这表明这些函数不是正确执行或完全执行。
  • (讨厌的方式)用const_cast抛弃constability - 这应该是真的是最后的手段,并且只有当您确定ClassName::method()实际上没有改变任何状态。

UPDATE2,以@ AKN的评论 - 例如虚掷常量性:

void foo(const ClassName &name) 
{ 
    ClassName& temp = const_cast<ClassName&>(name); 
    ... .... 
} 
+0

ClassName :: method()是一个非const方法。我想如果有一种方法可以解决这个问题,如果ClassName :: method()是非const。因为所有我需要的是知道名称的一些信息,我不想改变它 – 2010-05-21 08:42:24

+0

@small_potato:你为什么不把method()作为const方法? – Naveen 2010-05-21 08:45:01

+1

@small:解决它的方法是使'ClassName :: method()'为一个const方法:'ClassName :: method()const'。 http://www.parashift.com/c++-faq-lite/const-correctness.html提供了很多很好的信息。 – 2010-05-21 08:45:52

6

去您所提供的描述,它看起来像在ClassNamemethod()是一个非const方法。如果你试图在const对象上调用一个非const方法,编译器会抛出一个错误。当你做了ClassName temp = name;你创建了一个拷贝的变量到一个临时的非const对象temp。您可以调用此对象上的任何方法,但因为它是副本,所以在此对象上所做的修改将不会反映在name对象中。

编辑

来解决它的最好方法,就是让ClassName::method常量,如果它不修改任何成员变量。如果是这样,则不应将函数foo中的参数作为常量参考。您应该将参数作为非const引用。

相关问题