2013-06-14 1 views
1

У меня есть функция const в C++, откуда я вызываю функцию 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 тип структура А. Поскольку класс :: 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); 
} 
+5

Сделать 'ClassEx :: ClassFunction' не-'const'? Хотя я не вижу, как «pPointer» будет изменен внешней функцией, поскольку вы передаете ее по значению. – juanchopanza

+0

О, позвольте мне изменить это. – Yogi

+0

ClassEx :: ClassFunction, это не может быть выполнено неконстантно. – Yogi

ответ

2

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

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

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

+0

Hi Angew: Спасибо за ваш ответ. Не могли бы вы рассказать мне, почему он должен быть потокобезопасным и как это сделать? – Yogi

+0

@Yogi Если у вас есть время, посмотрите отличный разговор Херба Саттера (http://channel9.msdn.com/posts/C-and-Beyond-2012-Herb-Sutter-You-dont-know-blank-and -blank) по этому вопросу. * TL; DW: * стандартная библиотека теперь ожидает, что операции 'const' будут потокобезопасными, поэтому, если вы используете свой класс при любом взаимодействии с std. библиотеки, вы должны соблюдать. Обычный подход к изменяемым членам - это защита их мьютексом. Подробная информация о том, как это сделать, составляет около 20-ти знака в разговоре. – Angew

+0

Большое спасибо. – Yogi

0

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

Если есть альтернатива mutable, то не нужно было бы ключевое слово.

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

Лучшее (в качестве предлагаемого juanchopanza) состоит в том, чтобы сделать ClassEx::ClassFunction() не-const.

+0

Привет, когда я пробовал отлаживать, он показывал 0X00 для pPointer. Есть ли вред в использовании mutable? – Yogi

+0

@Yogi Нет, это означает, что в вашем коде есть другие проблемы –

 Смежные вопросы

  • Нет связанных вопросов^_^