16

私は大量のコードをリファクタリングしています。そこでは、常にそのオブジェクトのメンバーの値を持つ多数の関数に追加のパラメーターを追加する必要があります。何かのようなもの

class MyClass
{
public:
   CMyObject A,B;

   void MyFunc(CMyObject &Object);
   // used to be void MyFunc();
};

さて、実際に読んでみたいと思います

class MyClass
{
public:
   CMyObject A,B;

   void MyFunc(CMyObject &Object = A);
};

しかし、非静的メンバーである既定のパラメーターを持つことは許可されていません。これが不可能であることを示唆するこの同様の質問を読みましたが、合理的な回避策があるかどうか疑問に思っています。理由は、95% の確率でデフォルト パラメータが使用されるため、デフォルト パラメータを使用すると、変更が必要なコードの量が大幅に削減されるからです。これまでのところ、私の最善の解決策は次のようなものです。

class MyClass
{
public:
   CMyObject A,B;

   void MyFunc(BOOL IsA = TRUE);
};

void MyClass::MyFunc(BOOL IsA)
{
    CMyObject &Object = A;
    if (!IsA)
        Object = &B;
}

これはエレガントではありませんが、私が見逃しているこれを行うより良い方法はありますか?

編集: FWIW、余分なパラメーターの理由は、問題のオブジェクトからいくつかの状態関連メンバーを外部化して、マルチスレッドを支援することです。

4

2 に答える 2

21

どうですか :

class MyClass
{
public:
   CMyObject A,B;

   void MyFunc()
   { 
     MyFunc(A); 
   }
   void MyFunc(CMyObject &Object);
};

?

于 2010-02-19T12:10:18.960 に答える
4

別の方法:

class MyClass
{
public:
   MyObject A,B;

   void MyFunc(MyObject MyClass::*myObject = &MyClass::A) {
       MyObject& obj = *(this->*myObject);
   }
};

これにより、別のMyClassインスタンスからMyObjectメンバーを渡すことさえ不可能になります。MyFuncを呼び出すための3つの有効なオプションは、、.MyFunc()および.MyFunc(&MyClass::A)です。.MyFunc(&MyClass::B)

于 2010-02-19T12:49:41.550 に答える