7

長さの現在の値をデフォルトのパラメーターとして関数の引数として渡そうとしていました。しかし、コンパイラは次のエラーを示しています

「'this'はこのコンテキストでは使用できません」

私が犯した間違いは誰か教えてもらえますか??

class A
{

    private:
    int length;
    public:
    A();
    void display(int l=this->length)
    {
        cout<<"the length is "<<l<<endl;
    }

};


int main()
{

    A a;
    a.display();    
    return 0;

}
4

3 に答える 3

17

メンバー機能:

void display(int l=this->length)

概念的にはこれと同等です。

void display(A * this, int l=this->length); //translated by the compiler

つまり、§8.3.6/ 9(C ++ 03)が言うように、C++では許可されていない他のパラメーターのデフォルト引数である式で1つのパラメーターを使用しています。

デフォルトの引数は、関数が呼び出されるたびに評価されます。関数の引数の評価の順序は指定されていませんしたがって、関数のパラメータは、評価されない場合でも、デフォルトの引数式で使用されないものとします。

C++ではこれが許可されていないことに注意してください。

int f(int a, int b = a); //illegal : §8.3.6/9

解決策は、次のようにパラメータをとらない1つのオーバーロードを追加することです。

void display()
{
    display(length); //call the other one!
}

もう1つの関数を追加したくない場合は、パラメーターに不可能なデフォルト値を選択してください。たとえば、負になることのない長さ-1を記述しているため、デフォルト値として選択し、関数を次のように実装できます。

void display(int l = -1)
{
      if ( l <= -1 ) 
           l = length; //use it as default value!
      //start using l 
}
于 2012-06-23T05:18:07.067 に答える
3

代わりに、ユーザーのオーバーロードと転送を行うことができます。

class A
{
    private:
    int length;
    public:
    A();

    void display()
    {
        display(this->length);
    }

    void display(int l)
    {
        cout<<"the length is "<<l<<endl;
    }
};
于 2012-06-23T05:20:05.973 に答える
1

コンパイル時にはオブジェクトがないため、これはありません。

メンバー関数がプロパティ自体にアクセスできる場合、オブジェクトのプロパティの1つをデフォルト値としてメンバー関数に渡すのはなぜですか?

于 2012-06-23T05:18:08.530 に答える