1

多数の条件付きブロック全体で参照変数を使用する場合、参照変数をどのように宣言すればよいですか? 例えば:

for (i = ...) {
    if (expr_1(i)) {
        // y[idx(i)] only exists when expr_1 is true
        // i.e. idx(i) is a valid index only when expr_1 is true 
        MyType &x = y[idx(i)];  
        ...
    }

    ... // Stuff not dependent on x

    if (expr_2(i)) {   // (expr_2 is such that expr_1 implies expr_2)
        foo(x);        // error, as x not scoped to persist to here
        ...
    }

    ... // More stuff not dependent on x

    if (expr_3(i)) {   // (expr_3 is such that expr_1 implies expr_3)
        bar(x);        // error, as x not scoped to persist to here
        ...
    }

    ... // etc
}

宣言時に参照変数を初期化する必要があるため、条件付きブロックの外で宣言することはできませんが、参照する変数は条件付きブロック内にのみ存在します。

4

1 に答える 1

1

これらの方法のいずれかがうまくいきますか?

  1. 参照を使用するための厳しい要件がない場合は、ポインターを試してください。次に、親スコープで宣言し、NULL で初期化できます。その後、使用する前に非 NULL をチェックします。

  2. MyType がオブジェクトの場合、IsInitialized() を定義するベースから派生させ、これを呼び出すことができます。MyType がスカラーの場合、型の範囲内であるが、型が表すものの範囲外である値がある場合、そのような値を使用して「設定されていない」ことを示し、次のようなことを行います。

.

MyType notInitialised(NOT INITIALISED VALUE);
for (i = ...)
{
        MyType &x = expr_1(i) ? y[idx(i)] : notInitialised; 
        // code not needing x
        if (expr_2(i) && x != notInitialised) {
            ...
        }

それが役立つことを願っていますか?

于 2013-05-06T18:57:03.300 に答える