我在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);
}

最佳答案

有两种可能的方案:

  • pPointer有助于ClassEx对象的可观察(或逻辑)状态。在这种情况下,ClassFunction修改对象的可观察状态,因此而不是应该是const
  • pPointer是一个实现细节,它不影响可观察状态(例如内部缓存)。在这种情况下,mutable是正确的工具。还要注意,按照C++ 11线程安全规则,mutable成员应该是线程安全的;也就是说,它们应该是atomic或受互斥锁保护。
  • 关于c++ - C++中成员变量的关键字可变的替代方法,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/17102709/

    10-11 18:34