こんにちは。お世話になります。WindowsXP VC++.NETのマネージコードで開発していま
す。
switch ステートメントでちょっとした問題が出たので質問させてください。
String* の型でswitchを使いたいのですが上手くいきません。もしかして不可能なんで
しょうか?
こんな感じです。
String* ss;
//途中省略
switch(ss)
{
case 'A':
return 0;
break;
case 'B':
return 1;
break;
default:
return 2;
break;
}
こうすると、「error C2450: switch 式の求める数値の型 'System::String __gc *' が
無効です」とでてしまいます。やはりString* はポインタなので違った書き方が要求さ
れるってことですかね?どなたかわかりますか?
すみません。ちょっと足りなかったです。これはint型を返す関数の中なので、returnが
使われています。
ssはポインタ型なんですよね? で、各caseは文字定数なんですよね。全然型が違うのでダ
メです。
ssの中身を一旦char or int型の変数に入れて、それをswitch文に使うか、
if文でssの中身をいちいち照合するといいでしょう。
私だったら
struct
{
char ch;
int rc;
} *p, table[] = {
{ 'A', 0 },
{ 'B', 1 },
{ 0 , 2 }
};
みたいな構造体の配列を定義して、
int rc=2;
for( p=table; p->ch; p++ )
{
if( ssの中身がp->chと等しい )
{
rc=p->rc;
break;
}
}
return rc;
ってすると思います。
できません。 Managed C++ は C# ではありませんから。
ある一意の文字列からある値を取得するような時は
HashTableクラスを使うと便利です。
System::Collections::Hashtable* table;
table = __gc new System::Collections::Hashtable();
table->Add( SA, __box( 0 ) );
table->Add( SB, __box( 1 ) );
System::String* s = A;
if ( table->ContainsKey( s ) )
{
return *( dynamic_cast< __box int* >( table->Item[ s ] ) );
}
return 2;
みなさんありがとうございました。
とりあえず、Hashtable class を使ってうまくいきました。tibさんのやりかたもやっ
てみます。やはり考え方を変えるってのは大事ですね。
ちなみに、
> int型を返す関数
ということなので、何度も呼ぶたびに、Hashtableをつくるのは無駄が多すぎます。
__gc クラスにして、staticなメンバ変数にして使うと効率が良くなります。
例)
#using <mscorlib.dll>
using namespace System;
using namespace System::Collections;
__gc class TEST
{
private:
static Hashtable* tbl = new Hashtable();
static TEST()
{
tbl->Add( SA, __box( 1 ) );
tbl->Add( SB, __box( 2 ) );
}
public:
static int GetNumber( String* key )
{
if ( tbl->ContainsKey( key ) )
{
return *( static_cast< __box int* >( tbl->Item[ key ] ) );
}
return 0;
}
};
int main( void )
{
int n1 = TEST::GetNumber( SA );
int n2 = TEST::GetNumber( SB );
int n3 = TEST::GetNumber( SC );
Console::WriteLine( A={0},B={1},C={2},
__box( n1 ), __box( n2 ), __box( n3 ) );
return 0;
}
C++: マネージ拡張の仕様
19 静的クラス コンストラクタ
http://www.microsoft.com/japan/msdn/library/default.asp?
url=/japan/msdn/library/ja/vcmxspec/html/vcmanagedextensionsspec_19.asp