替代C ++中成员变量的关键字mutable

时间:2013-06-14 06:52:37

标签: c++ const mutable

我在C ++中有一个const函数,我从那里调用C函数。

class ClassEx
{
  A* pPointer // declaration of the pointer

};

void
ClassEx::ClassFunction() const
{

     int error = AFunctionInExternLib(&pPointer); //pPointer will be instantiated by this function.
}

//Signature of AFunctionInExternLib 
Struct A
{
};

AFunctionInExternLib(A** pPointer);

现在,我有一个类型为struct A的classEx的成员变量。 由于Class :: ClassFunction()是一个const函数,我无法按原样传递pPointer。所以我把声明作为

class ClassEx
{
   mutable A* pPointer // declaration of the pointer

};

这编译很好,但我想知道是否有其他方法可以实现这一点而不使用mutable关键字?

请注意我也试过了,

 void
 ClassEx::ClassFunction() const
 {
    A* pAnotherPointer = const_cast<A*>(pPointer);// remove constness

    int error = AFunctionInExternLib(&pAnotherPointer);
 }

但这会实例化pAnotherPointer而不是pPointer。无论如何要将pAnotherPointer的地址共享给pPointer吗?

这种方法有什么问题。

class ClassEx
{
  A* pPointer // declaration of the pointer

};

void
ClassEx::ClassFunction() const
{

   ClassEx* pTempPointer = const_cast<ClassEx*>(this);  
   int error = AFunctionInExternLib(&pTempPointer->pPointer); 
}

2 个答案:

答案 0 :(得分:2)

有两种可能的情况:

  1. pPointer有助于ClassEx对象的可观察(或逻辑)状态。在这种情况下,ClassFunction会修改对象的可观察状态,因此应为const

  2. pPointer是一个实现细节,它不会影响可观察状态(例如内部缓存)。在这种情况下,mutable是正确使用的工具。另请注意,根据C ++ 11线程安全规则,mutable成员应该是线程安全的;也就是说,它们应该是atomic或受互斥锁保护。

答案 1 :(得分:0)

  

替代C ++中成员变量的关键字mutable

如果有mutable替代品,那么我们就不需要关键字。

A* pAnotherPointer = const_cast<A*>(pPointer); - 这只是从指针中删除constness,允许您在对象上调用const方法。地址是一样的。

最好的(如juanchopanza所建议的)是使ClassEx::ClassFunction()非常数。