ページ 11

c++でクラスを変数のように扱う方法を教えてください。

Posted: 2009年10月21日(水) 04:04
by Eeel
はじめまして。
環境はXPでVC++2008EEです。

変数のように扱える、整数を扱うクラスを作ろうとしています。
class Integer{
  private:
    int value;
(中略)
}

main()
{
  Integer my_int;
  int result;

  my_int = 5;               //←これはできました。
                            //そして代入時にこっそり2倍にして、10として格納されてるとします。
                            //(本当はもう少し複雑で面倒な事をしています)
  result = my_int;          //←これができませんでした。10を代入しようとしてます。
  printf("%d", my_int);     //←これもできませんでした。10を表示させようとしてます。

}
どのようにすればよいのでしょうか?
よろしくお願いします。

Re:c++でクラスを変数のように扱う方法を教えてください。

Posted: 2009年10月21日(水) 05:04
by Eeel
半分自己解決しました。
変換演算子というのを使って
class Integer{
  public:
  operator int(){ return value; }
}
とする事で
result = my_int;
は無事に代入できました。printfの方は
printf("%d", (int)my_int);
とする事で一応は目的通りの結果になりましたが
キャストしないと0が帰ってくるようなので
(ところで、このキャストはstatic_castでしょうか?)
このままだと使用方法によってはうっかりバグの原因にしてしまう可能性が高そうです。
良い方法がありましたらご教示ください。

Re:c++でクラスを変数のように扱う方法を教えてください。

Posted: 2009年10月22日(木) 00:48
by tk-xleader
printfの引数は可変長で、クラスを渡すと未定義の結果になると思います。
また、変換演算子を定義したとしても、printfの引数にした場合変換演算子が呼び出しされないのでキャストするしか方法は無いと思います。

後、
(type)expr
は単なるstatic_cast<type>(expr)ではなくて、それに加えてconst_cast<type>(expr)とreinterpret_cast<type>(expr)の合成みたいなものです。(この3つをうまく組み合わせることで大抵の(type)exprは置換できます。)

Re:c++でクラスを変数のように扱う方法を教えてください。

Posted: 2009年10月22日(木) 00:56
by たかぎ
> printfの引数は可変長で、クラスを渡すと未定義の結果になると思います。

正確には、C互換型以外を渡せば未定義ですね。
クラスであっても、C互換構造体やC互換共用体であれば未定義にはなりません。

Re:c++でクラスを変数のように扱う方法を教えてください。

Posted: 2009年10月22日(木) 01:58
by Eeel
お返事ありがとうございます。

クラスである事を意識させずに変数と同じように扱えれば完璧、と思い
明示しなければint型として扱い、本来のクラスとして扱いたい時は(Integer)とキャストする
というような事ができればと思ったのですが、そのような方法は無いみたいですね。

>(type)exprは単なるstatic_cast<type>(expr)ではなくて
はい。
ただのキャストは危険な事もあるのでtkmakwins15さんの仰られた3つのキャスト(とdynamic_cast)で
キャストの目的を明確にするのがよいとありました。
static_castは型変換、reiterpret_castは型変更で、
今回の場合は「変換演算子を使って欲しい」という目的なのでstatic_castではないかと思いました。
どうでしょうか?