1

C 関数を呼び出している場所から、C++ に const 関数があります。

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);

これで、構造体 A 型の classEx のメンバ変数ができました。Class::ClassFunction() は const 関数であるため、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);
 }

しかし、これは pPointer ではなく、pAnotherPointer をインスタンス化します。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); 
}
4

2 に答える 2

2

次の 2 つのシナリオが考えられます。

  1. pPointerオブジェクトの観察可能な (または論理的な) 状態に貢献しClassExます。このような場合、ClassFunctionはオブジェクトの監視可能な状態を変更するため、 であってはなりませconst

  2. pPointer監視可能な状態 (内部キャッシュなど) に影響を与えない実装の詳細です。そのような場合、mutable使用する正しいツールです。また、C++11 のスレッド セーフ規則に従って、mutableメンバーはスレッド セーフである必要があることに注意してください。つまりatomic、ミューテックスで保護する必要があります。

于 2013-06-14T07:04:15.027 に答える
0

C++ のメンバー変数のキーワード mutable の代替

に代わるものがあればmutable、キーワードは必要ありません。

A* pAnotherPointer = const_cast<A*>(pPointer);- これは、ポインタから constness を削除するだけで、オブジェクトで const メソッドを呼び出すことができます。アドレスは同じです。

(juanchopanza が提案したように) 最善の方法は、ClassEx::ClassFunction()非 const にすることです。

于 2013-06-14T07:03:19.757 に答える