• 締切済み

locale::idとid型について

objective-cでなんでも入れられるid型がありますが、cocos2dの環境下でc++から呼び出したいときにidにあう型がありません。一応std::local::idというのを見つけたのですが void DBClassBridge::updateColumn(string table, string field, locale::id input, string where, string target) { [DBClass_objc updateColumn:[[[NSString alloc] initWithCString:table.c_str() encoding:NSUTF8StringEncoding] autorelease] field:[[[NSString alloc] initWithCString:field.c_str() encoding:NSUTF8StringEncoding] autorelease] input:(id)input //ここでエラー where:[[[NSString alloc] initWithCString:where.c_str() encoding:NSUTF8StringEncoding] autorelease] target:[[[NSString alloc] initWithCString:target.c_str() encoding:NSUTF8StringEncoding] autorelease]]; } 以下のようなエラーが出ます。 Cannot convert 'locale::id' to 'id' without a conversion operator やはりデータ型があっていないっぽいです。 objective-cのid型にはどのデータ型を用いればいいのでしょうか?またはlocal::idからidへとどう変換すればいいのでしょうか? 知っている方、是非お願いします。

みんなの回答

回答No.1

これはDBClass_objcクラスやupdateColumnメソッドがどういうものなのかを 説明しないと本来答えられませんが、雰囲気的にはデータベースレコードを 更新するためのメソッドでinputパラメータは、fieldパラメータで指定し たフィールド名の更新値を指定するものだろうと推測して回答します。 まず、Objective-Cのid型に近いのはC++ではvoid *です。 (参考) http://wisdom.sakura.ne.jp/programming/objc/objc9.html id型というのは、要するにオブジェクトならなんでもありの型で その中に入っているオブジェクトを使うには実際にその中に入っている オブジェクトクラスにキャストしてアクセスします。 void *型は、ポインタならなんでもありの型です、 そのポインタが指している領域にアクセスするには、実際にその中に入っている 構造体ポインタの型にキャストしてアクセスします。 id型のオブジェクトキャストは、不適切なキャストを指定すると エラーになるのでメモリ破壊にはなりませんが、 void *のキャストは、どんなキャストでも強制的にやって しまうので、間違えると、簡単にメモリ破壊を引き起こす とても危険な処理です。 で、inputを(void *)型として定義すればそれでOKじゃなくて 実際にはその中に入っているC++オブジェクトのクラスに キャストした後、Objective-C用のクラスに変換して使用する 必要があります。 (例:void *→stringにキャスト→NSStringに変換→DBClass_objcのinputに指定) こういう汎用型のパラメータを受け付けるメソッドを 作るのではなく、string型のinputを受け付けて、 それをNSStringに変換して引き渡す等、格納したいオブジェクトの クラス毎に別のメソッドを作った方がたぶん安全だと思います。

関連するQ&A