1

私はクラスを実装しており、宣言して初期化する必要がある多くの変数を使用して処理を行う関数があります。

変数宣言で関数が乱雑にならないようにして、次のようなことをしたいと思います。

doFunction(){
  declare();

  //Do things with variables declared in declare()
}
void declare(){
  //declare lots of variables here
}

これは、変数が declare() にスコープされ、doFunction() によって認識されないため機能しません。この問題を処理する賢明な方法は何ですか?

4

3 に答える 3

2

宣言する各変数には値を割り当てる必要があるため、宣言と初期化を組み合わせる必要があります。つまり、代わりに

int x;
double y;
std::string z;
x = 1;
y = 2.0;
z = "3";

これを行う:

int x = 1;
double y = 2.0;
std::string z("3");

これは、ローカルでこのアプローチをプッシュできる限りです。変数の宣言は関数本体の重要な部分であり、変数をリモートの場所に移動することはできません (おそらく、そうすべきではありません)。

メンバー関数をネストされたプライベート クラスに移動し、ローカル変数をクラスに移動して、そこで計算を行うこともできます。

class specialCalc {
    int x;
    double y;
    std::string z;
    specialCalc() : x(1), y(2.0), z("3") {}
public:
    int calculate() {
        ...
    }
};

void doFunction() {
     specialCalc calc;
     cout << calc.calculate() << endl;
}

PS: プリプロセッサ ベースのソリューションについては、読みやすさに悪影響を及ぼすため、意図的に言及していません。

于 2012-11-01T13:06:55.977 に答える
1

私はこれを実際に提唱しているわけではありませんが、

struct Declare
{
    int x;
    float y;
    char z;
    vars() :x(1),y(3.14),z('z') {}
};

void doFunction()
{
    Declare vars;
    // use vars.x, vars.y and vars.z as your variables
}
于 2012-11-01T13:12:55.113 に答える
0

いくつかの選択肢があります:

1) 乗り越える。多くの変数が必要な場合は、それらをどこかで宣言する必要があるという事実に苦しむ必要があります。

2) それらをメンバー変数としてクラスまたは構造体に入れ、.h ファイルで宣言できるようにします。.C/.cpp ファイルでは非表示になります。

3) それらを配列に集約し、配列のみを宣言してfor()ループなどで初期化します。これは、それらがすべて同様のタイプであり、「インデックス 4」が私の「これに対するカウンター オブジェクト」であり、「インデックス 5」が私の「印刷先のもの」であるなどのばかげたことをしない場合にのみ機能します。変数自体に関連付けられた名前が失われるため、後でコードを読むときに役立ちます (もちろん)。

4) 別の場所の define ステートメントに入れます。

#define MYVARS int a; char b[1024]; ...

void funstuff() {
    MYVARS
}

5) IDE を変更して、コードを表示しているときに変数宣言を非表示/折りたたむことができるようにします。

これらすべての選択肢の中で、おそらく 1 番が正しい答えであることに注意してください :-)

于 2012-11-01T13:38:06.870 に答える