const — альтернатива изменяемому ключевому слову для переменных-членов в переполнении стека

У меня есть константная функция в 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);
}

1

Решение

Есть два возможных сценария:

  1. pPointer способствует наблюдаемому (или логическому) состоянию ClassEx объект. В таком случае, ClassFunction изменяет наблюдаемое состояние объекта и поэтому должен не быть const,

  2. pPointer это деталь реализации, которая не влияет на наблюдаемое состояние (например, внутренний кеш). В таком случае, mutable правильный инструмент для использования. Также обратите внимание, что в соответствии с правилами безопасности потоков C ++ 11, mutable члены должны быть потокобезопасными; то есть они должны быть atomic или защищен мьютексом.

2

Другие решения

Альтернатива ключевому слову mutable для переменных-членов в C ++

Если бы была альтернатива mutableтогда нам не понадобится ключевое слово.

A* pAnotherPointer = const_cast<A*>(pPointer); — Это просто удаление константности из указателя, что позволяет вам вызывать константные методы для объекта. Адрес тот же.

Лучшее (как предположил juanchopanza) — это сделать ClassEx::ClassFunction() неконстантная.

0

По вопросам рекламы [email protected]