2

次の関数があるとします。

void myFunc(P& first, P& last) {
    std::cout << first.child.grandchild[2] << endl;
    // ...
}

さて、first.child.grandchild[2]私の目的には長すぎるとしましょう。たとえば、 内の方程式に頻繁に現れるとしますmyFunc(P&,P&)。そのため、関数内にある種のシンボリック参照を作成して、方程式が乱雑にならないようにしたいと思います。どうすればこれを行うことができますか?

特に、以下のコードを検討してください。line_1a からの出力が常に line_1bからの出力と同じになるだけでなく、 line_2a からの出力が常に line_2b からの出力と同じになるように、挿入できるステートメント知る必要があります。つまり、 の値のコピーではなくfirst.child.grandchild、オブジェクトへの参照またはシンボリック リンクが必要first.child.grandchildです。

void myFunc(P& first, P& last) {
    // INSERT STATEMENT HERE TO DEFINE "g"

    std::cout << first.child.grandchild[2] << endl; // line_1a
    std::cout << g[2] << endl;                      // line_1b

    g[4] = X; // where X is an in-scope object of matching type

    std::cout << first.child.grandchild[4] << endl; // line_2a
    std::cout << g[4] << endl;                      // line_2b
    //...
}    
4

2 に答える 2

1

ポインタを使用してください - その後、関数で変更できます。

WhateverGrandchildIs *ptr=&first.child.grandchild[2];

std::cout << *ptr << std::endl; 

ptr=&first.child.grandchild[4];

std::cout << *ptr << std::endl; 
于 2012-08-22T03:21:34.097 に答える
1

の型とサイズがでgrandchildあるとします。以下は、配列の参照を作成する方法です。TN

void myFunc(P& first, P& last) {
  T (&g)[N] = first.child.grandchild;
  ...
}

ここではポインターを好みませんが、それも可能な方法です。なぜなら、配列の静的サイズは、範囲チェックのための静的アナライザーに役立つからです。

C++11 コンパイラを使用している場合autoは、これが最善の方法です (@SethCarnegie によって既に言及されています)。

auto &g = first.child.grandchild;
于 2012-08-22T03:31:30.830 に答える