0

我正在使用一个成员函数,它只是将对象的内部方向设置为参数中给出的值:

void A::SetOrientation(float a[3]);

在另一堂课中,我有以下内容:

class B
{
public:
  RestoreStateTo(A* const o_pA) const
private:
  float d_orientation[3];
};

void 
B::RestoreStateTo(A* const o_pA) const
{
   o_pA->SetOrientation(d_orientation);
}

我收到以下编译器错误(使用 Visual Studio 2010):

error C2664: 'void A::SetOrientation(float [])' : cannot convert parameter 1 from 'const float [3]' to 'float []'

我发现我可以避免这个问题o_pA->SetOrientation(const_cast<float *>(d_orientation));,但我想更好地了解正在发生的事情。

我希望能解释一下为什么将数组参数转换为const数组,并提出处理错误的正确方法?

4

3 回答 3

2

因为您的函数原型 void B::RestoreStateTo(A* const o_pA) const 表示您不会修改 B 的任何成员。由于 d_orientation 是 B 的属性,因此在此函数中它是 const 。

于 2013-07-29T22:37:18.020 回答
0

你的 SetOrientation 函数应该接受一个常量,

void A::SetOrientation(const float a[3]);

否则,A::SetOrientation 可能会修改您传入的数组。因为您有“B::RestoreStateTo(A* const o_pA) const ”,这意味着编译器不会让您将指针传递给 B: :d_orientation 作为非常量输入,因为 A::SetOrientation 不能保证不修改它。

于 2013-07-29T22:41:23.217 回答
-1

您已经声明了一个const成员函数,因此 的所有成员都this将被视为const该函数内部。d_orientation因此,将其视为应该不足为奇const

使此代码非法的原理相同:

const B* p = ...;
p->d_orientation[0] = 0.0f; // error, assigning member of `const` object
于 2013-07-29T22:44:44.030 回答