1

関数内でtypedefを実行するにはどうすればよいですか?クラスBにintxデータメンバーがあると考えてみましょう。次のものをコンパイルしようとすると、次のようになります。「。」の前に初期化子が必要です。トークン

この例ではすべてが単純ですが、私のコードではtest.xyzfのようなことをします。したがって、必要なデータメンバーに到達するまでオブジェクト内に複数のオブジェクトがあるので、typedefが役立ちます。

class A
{
  B test;

  A(B test1)
  { 
    test = test1;
  }

  function f()
  {
    typedef test.x x; //how come this doesn't compile?

  }
}
4

4 に答える 4

4

xタイプではなく変数です。C++11 では、次のタイプを判別するために使用できます。decltypex

void f()
{
    decltype(test.x) x;
}

または、操作したいメンバーへのローカル参照を宣言することもできます。

void f()
{
    auto& x_ref(test.x); // Or explictly state the type.
}
于 2013-03-05T16:49:16.123 に答える
1

あなたが求めているのは、長い一連の名前の内容を「省略」する方法だと思います。私が過去にこれを行った方法(関連する場合)は、参照を使用することです:

struct Blah
{
  int x, y, z;
};

class X
{
   Blah *arr[10];

   X()
   {
      for(int i = 0; i < 10; i++)
      {
         arr[i] = new Blah;
      }
   }
}

class Y
{
   X var;
};


Y y;

for(int i = 0; i < 10; i++)
{
     y.var.arr[i]->x *= 4; 
     y.var.arr[i]->y *= 3; 
     y.var.arr[i]->z *= 5; 
}

次のように記述できます。

for(int i = 0; i < 10; i++)
{
     Blah &b = y.var.arr[i];

     b.x *= 4; 
     b.y *= 3; 
     b.z *= 5; 
}

これで、少し読みやすくなりましたね。

于 2013-03-05T16:55:22.463 に答える
1

typedef は、の名前を導入します。
test.x型ではなく変数です。
ですが intintそのものではありません。

変数に新しい名前を導入したい場合は、参照を使用してください。

int& x = test.x;  // "x" is now a different name for test.x
int& y = test.x.y.z.f; // "y" is now a different name for test.x.y.z.f.
于 2013-03-05T16:52:03.993 に答える
1

typedef変数を使用してシミュレートする場合は、参照を使用します。type_of_x& x = test.x;

于 2013-03-05T16:51:32.320 に答える