0

我有一个 const 方法,我想在其中将 B 类成员的属性设置为当前实例 A(通过指针进行反向引用)

A类:

void A::foo () const
{
   ...
   ...
   B b;
   b.setA(this);
   ...
}

B类:

setA(A * Ap){
   this->pointerToA = Ap;
}

B * getA() {return pointerToA;}

A* pointerToA;

编译器不允许这样做...好的,现在我尝试了

B类:

setA(const A * Ap){
   this->pointerToA = Ap;
}

const A * getA() {return pointerToA;}

const A* pointerToA;

这解决了原来的问题,但现在我无法调用 B:

...
this->getA()->anotherMethodOfA();
...

因为我得到“无法将 'this' 指针从 'const A' 转换为 'A&'

虽然我理解上面的问题,但我不知道现在如何调用其他方法以及问题出在哪里......为什么错误消息中有一个 A&,因为我没有对 A 的引用?

4

2 回答 2

1

由于 A 是一个常量指针,因此您只能const在其上调用方法。有两种可能的解决方案:

  1. 如果您需要在 A 上调用非常量方法:const从 中删除说明符void A::foo () const,因为该函数实际上是this通过对 B 的调用进行修改的。
  2. 如果您不需要在 A 上调用非常量方法:makeanotherMethodOfA以及在 B 内部的 A 上调用的任何其他方法const

您得到的错误是合法的,否则您将违反纯方法的定义。

如果您需要foo并且const在 A 内部调用的方法foo不会以通过公共接口可见的方式更改它(例如执行一些缓存等),您也可以尝试使用mutable带有修改字段的说明符。但请不要滥用此功能!

于 2013-10-01T00:01:15.447 回答
0

您可以通过使用Scott Meyers'解决方案来解决问题:所有 getter 的两个版本,一个non-const版本调用该const版本,该const版本返回预期的变量:

const A* GetA() const { return pointerToA; }
//Cast 'this' to a const reference to B
//(this allows you to call the const version of the getter instead of infinite recursion).
//Cast away the const-ness of the result returned by the const version
//and return the non-const version.
A* GetA() { return const_cast<A*>(static_cast<const B&>(*this).getA()); }
于 2013-10-01T01:38:29.280 回答