0

だから私はこれに行きます:

class A;

class B : public A;

class C : public B;

vector<A*> *vecA;

vector<C*> *vecC;

そして、vectC を vecA にキャストしたいと考えています。

vector<A*> *_newA = static_cast< vector<A*>* >(vecC); //gives an error

そこで、void ポインターをバッファーとキャストとして使用しました。

void *buffer = vecC;

vector<A*> *_newA = static_cast< vector<A*>* >(buffer); //works

これは有効ですか?それを行う別の方法はありますか?

4

5 に答える 5

3

これは有効ですか?

いいえ、ちがいます。アクセスするとどうなるかは完全に未定義です。

それを行う別の方法はありますか?

はい。それはあなたが何をしたいかによって異なります:

  1. コンテンツをコピーします。std::copy(vecC.begin(), vecC.end(), std::back_inserter(vecA));

  2. またはその他の派生型A*のコンテナーまたはイテレーターが指定された場合に、ランダム アクセス コンテナーとして動作するアダプターを作成します。C*

  3. 他にも解決策があると思います。やりたいことを教えてください

于 2012-08-06T15:48:47.323 に答える
1

を介して迂回する代わりにvoid*、C++11では。を使用しますreinterpret_cast

しかし、あなたが望む変換は非常に悪いことを許します:

#include <iostream>
#include <vector>
using namespace std;

class Base {};

class Derived: public Base
{ public: int x; Derived(): x(42) {} };

int main()
{
    vector< Derived* >  v;
    Derived             d;

    v.push_back( &d );
    cout << v.back()->x << endl;        // 42

    vector< Base* >*    pbv =
        reinterpret_cast< vector< Base* >* >( &v );
    Base                b;

    pbv->push_back( &b );
    cout << v.back()->x << endl;        // indeterminate value
}

T**これは、変換時に発生する問題とほぼ同じですT const**(許可されていないため、問題が発生する可能性があります)。要するに、自分が何をしているのかを正確に理解していない限り、これを行わないでください。長い方ですが、ここで説明する余地はありませんが、可変コレクションと不変コレクションを区別し、非常に注意する必要があります。


編集:他の人(変換の質問に対処しなかった)がすでに述べたように、実用的な解決策は、Aポインターのベクトル、またはスマートポインターであり、C ++ポリモーフィズム(つまり仮想メンバー関数)を使用します。

于 2012-08-06T15:53:21.333 に答える
1

おそらく知っておく必要のある魔法の言葉は、「共分散」と「反分散」です。非常に密接に関連する問題については、こちらをご覧ください。

短い答え: 単にキャストを使用して変換を行うためのきちんとした賢明な方法はありません。古いベクターのコンテンツを新しいベクターにコピーする必要があります。

しかし、もっと重要なこと: 1.new標準のコンテナ タイプでは絶対に使用しないでください。2. 標準コンテナー型へのポインターを渡さないでください。3. 独自のオブジェクトに生のポインターを渡さないでくださいstd::shared_ptr。代わりに使用してください。

于 2012-08-06T15:52:10.527 に答える
1

ジェネリック (テンプレート) 型の共変サポートを探しているように見えます。これは、C++ ではまったくサポートされていません。CLR および C#/VBでサポートされていますが、最新バージョンでのみサポートされています。

それにもかかわらず、他の人の反応を反映するために、間違ったツリーを吠えている可能性があります。私の推測では、A 型のオブジェクトへのポインターのベクトルが必要です...そして、この型には、必要に応じて仮想メソッドと仮想デストラクタを含める必要があります。解決しようとしている高レベルの問題をよりよく理解せずに、適切な代替アプローチについてより具体的にすることは不可能です-それはあなたの質問からは明らかではありません.

于 2012-08-06T15:51:39.170 に答える