0

演算子のオーバーロードに関連する質問があります。次のコードが示すように、クラスとその演算子のオーバーロード関数を簡単に定義できます。

typedef std::vector<std::vector<int> > ARRAY; 


class ABC
{
public:
    ABC():a(0)
    {
    };
    int a;
    ABC& operator = (int value)
    {
        a = value;
        return *this;
    }
    ABC(int value)
    {
        a = value;

    }
};


void obtain_priority_array(const std::vector<double> &weighting, const ABC &priority_array=NULL)
{

}

int main()
{
    vector<double> weighting;
    weighting.push_back(0.8);
    weighting.push_back(0.9);
    weighting.push_back(0.6);
    weighting.push_back(0.3);
    weighting.push_back(0.5);

    ABC test;
    obtain_priority_array(weighting, test);

    return 0;
}

上記の例では、関数 がデフォルトの引数を持つことができるようにclass ABC再定義されています。私の質問は、関数の最後のパラメーターがSTLからのものであるかどうかです。たとえば、を再定義するにはどうすればよいですか。ありがとう!operator =void obtain_priority_array(const std::vector<double> &weighting, const ABC &priority_array=NULL)const ABC &priority_array=NULLconst std::vector<int> &priority_array=NULLoperator =

編集: void get_priority_array(const std :: vector&weighting、const std::vector<int> &sample=NULLが失敗しました!

4

3 に答える 3

3

参照することはできませんNULL。問題は演算子のオーバーロードとは何の関係もありません。NULLデフォルト値として処理できるようにする場合は、パラメーターのタイプを参照からポインターに切り替えます。

void obtain_priority_array( const std::vector<double>& weighting, 
                            const ABC *priority_array = NULL)
{
  if( priority_array == NULL ) {
    // blah
  } else {
    // more blah
  }
}

もう1つのオプションは、Boost.Optionalのようなものを使用してオプションのパラメーターを表すことです。

typedef boost::optional<ABC> maybe_ABC;
void obtain_priority_array( const std::vector<double>& weighting, 
                            const maybe_ABC& priority_array = maybe_ABC() )
{
  if( !priority_array ) {
    // blah
  } else {
    // more blah
  }
}
于 2012-10-11T16:43:07.713 に答える
3

operator=あなたの誤解は、そのタイプのデフォルト引数を許可するために追加する提案から始まります。あなたの例では、それはoperator=呼び出されていませんが、ABC(int).

使用時にコードが受け入れられない理由std::vectorは、NULLそれが 0 に変換されるためです (少なくとも、ほとんどの場合はそうです) std::vector。多くのアイテムは明示的にマークされています。

当面の問題を解決するには、構文を次のように変更できます。

const std::vector<int> &priority_array = std::vector<int>(0)

ただし、これにより異なるセマンティクスが導入されます。を使用することでNULL、ベクトルを表現しないことを期待していたように見えます。このバージョンは、何も指定されていない場合に使用する空のベクターを提供します。ベクトルではありません。その区別が必要な場合は、参照は適切なツールではないため、boost のオプション ライブラリまたは単純なポインターを使用する必要があります。

于 2012-10-11T16:58:42.507 に答える
1

参照を作成するために使用するとき=は、まったく呼び出していませんoperator=。参照を初期化しています。

を使用する代わりにNULL、クラスの静的インスタンスを作成して null 値を表すことができます。

static const ABC ABC_NULL;

void obtain_priority_array(const std::vector<double> &weighting, const ABC &priority_array=ABC_NULL)
{
    if (&priority_array == &ABC_NULL) // the default was used

もちろん、参照の代わりにポインターを使用する方が簡単です。

于 2012-10-11T16:36:45.533 に答える