我在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);
}
答案 0 :(得分:2)
有两种可能的情况:
pPointer
有助于ClassEx
对象的可观察(或逻辑)状态。在这种情况下,ClassFunction
会修改对象的可观察状态,因此不应为const
。
pPointer
是一个实现细节,它不会影响可观察状态(例如内部缓存)。在这种情况下,mutable
是正确使用的工具。另请注意,根据C ++ 11线程安全规则,mutable
成员应该是线程安全的;也就是说,它们应该是atomic
或受互斥锁保护。
答案 1 :(得分:0)
替代C ++中成员变量的关键字mutable
如果有mutable
替代品,那么我们就不需要关键字。
A* pAnotherPointer = const_cast<A*>(pPointer);
- 这只是从指针中删除constness,允许您在对象上调用const方法。地址是一样的。
最好的(如juanchopanza所建议的)是使ClassEx::ClassFunction()
非常数。