1

I have a type definition のtypedef vector<Object*> ObjList;I also have a function vector<BigObject*>* ObjectBox::getBigObjectList();. BigObjectから継承されますObject

私がやりたかったのは、vector<BigObject*>*fromを取得しgetBigObjectList()て に変換することvector<Object*>*です。これは上向きのキャストであり、この型は として定義されているObjListので、基本的にそれを型に変換したかったのObjListです。

私は2つの方法を試しました.1つ目は

ObjList *normalObjectList = (ObjList*) box->getBigObjectList();

これはコンパイルされ、この記事 ( When should static_cast, dynamic_cast, const_cast and reinterpret_cast be used? ) から読みました。reinterpret-cast

次にstatic_cast、を使用しようとしましたが、無効な型変換というエラーが表示されました

ObjList *normalObjectList = static_cast<ObjList*> (box->ClipObjectInRect());

これもうまくいきません

ObjList *normalObjectList = static_cast<vector<Object*>*> (box->ClipObjectInRect());

なぜこれが機能しないのですか?これは、ネストされたクラスではなくstatic_cast直接クラス (それ自体など) をキャストするためにのみ使用できるためObjectですか (ここでは完全に推測しています)。この場合、どうすればよいですか?

4

3 に答える 3

15

型間の関係についてコンパイラが知らない (または知らないふりをしている) 場合も、静的キャストは失敗します。継承が2 つの間でpublicとして宣言されていない場合、コンパイラはそれらを無関係な型と見なし、同じ不可解な警告を出します。

これは私を噛んだので、共有したいと思いました。

于 2013-08-27T15:24:09.860 に答える
3

あなたの推論にはよくある欠陥があります。誰もが一度は同じ過ちを犯したことがあると思います。std::vector<>これが現在使用したい方法であるため、単なる出力コンテナーと考え​​ていますが、そうではありません。

次のコードがコンパイルされると想像してみてください。

vector<BigObject*>* bigVector = box->ClipObjectInRect(); // OK
ObjList* objVector = static_cast<ObjList*>(bigVector);   // Not OK; we'll now see why
objVector->push_back(new SmallObject()); // OUCH

ご覧のとおり、そのキャストを許可すると、SmallObject*のみを含むことができるものに a を入れようとすることができますBigObject*。これにより、実行時エラーが確実に発生します。

ところで、実際には、関連する型の配列間でキャストできます。これは C から継承された動作です。実行時エラーが発生します :)

于 2013-01-30T12:33:44.863 に答える
1

私は間違っているかもしれませんが、ベクター内の個々のオブジェクトをそれぞれキャストする必要があると思います。ObjList* を返すために getBigObjectList() をオーバーロードしてみます。したがって、オーバーロードされた関数は次のようになります

ObjList* ObjectBox::getBigObjectList()
{
 vector<Object*> return_vec
 for(vector<BigObject*>::iterator itr = ObjectBox.bigObjectList.begin(); itr != ObjectBox.bigObjectList.end(); itr++)
 {
  return_vec.push_back(static_cast<Object*> (itr));
 }
 return return_vec
}

ベクトルをリストとして記述している特定の理由はありますか? それとも、そもそもリストの代わりにベクトルを使用していますか?

編集:基本的に、デニスが言ったこと。

于 2013-01-30T12:13:40.510 に答える