У меня есть константная функция в C ++, откуда я вызываю функцию 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);
Теперь у меня есть переменная-член для classEx типа struct A.
Поскольку Class :: ClassFunction () является константной функцией, я не могу передать pPointer как есть. поэтому я сделал заявление как
class ClassEx
{
mutable A* pPointer // declaration of the pointer
};
Это компилируется нормально, но мне было интересно, есть ли другой способ добиться этого без использования изменяемого ключевого слова?
Пожалуйста, обратите внимание, что я попробовал это также,
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
или защищен мьютексом.
Альтернатива ключевому слову mutable для переменных-членов в C ++
Если бы была альтернатива mutable
тогда нам не понадобится ключевое слово.
A* pAnotherPointer = const_cast<A*>(pPointer);
— Это просто удаление константности из указателя, что позволяет вам вызывать константные методы для объекта. Адрес тот же.
Лучшее (как предположил juanchopanza) — это сделать ClassEx::ClassFunction()
неконстантная.