我在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/