0

を持っていますが、vector<MyType*>*どのようにアクセスされているのか完全にはわかりません。私は宣言しMyType* var = new MyType(params)ており、それが作成されたクラスで問題なくアクセスされています。数字は問題なく吐き出されます。それらのベクトルを返し、別のクラス (メソッド) からアクセスしようとすると、int main()まったく異なる数値が得られます。

私がそれにアクセスしている方法int main()

MyType* Temp = reinterpret_cast<MyType*>(&ReturnedVector[i]);

ここで何かミスが指摘されていますか?私はC++が初めてです。

編集: 明確化のためにコードを追加します。これが私の主な方法です:

int main(array<System::String ^> ^args)
{
    MyAPI API;
    std::vector<MyClass*>* RetVector = API.GetVector();

    for (unsigned int i = 0; i < RetVector->size(); i++)
    {
        MyClass* Temp = reinterpret_cast< MyClass* >(&RetVector[i]);
        cout << Temp->value << endl;
    }
    return 0;
}

別のクラスでメソッドを返すベクトルを次に示します。

vector<MyClass*>* MyAPI::GetVector()
{
vector<MyClass*>* Ret = new vector<MyClass*>();
for (int i = 0; i < 100; i++)
{
MyClass* Tmp = new MyClass(params);
Ret->push_back(Tmp);
}
return Ret;
}
4

2 に答える 2

3

は必要ありませんreinterpret_cast。それを行うときはいつでも、なぜそれを行っているのかを注意深く考えてください。コンパイラがあなたに与えているタイプの警告を克服することであれば、その警告は完全に有効かもしれません.

vector<MyType*> *ReturnedVector = some_function_that_returns_a_vector_pointer();

// NAUGHTY!
MyType* Temp = reinterpret_cast<MyType*>(&ReturnedVector[i]);

これは悪いです。ReturnedVectorがの配列へのポインターであると想定し、その配列の th 要素をvector<MyType*>要求します。i次に、その要素 ( MyType**) のアドレスを取得し、 にキャストしMyType*ます。あなたの数字が違うのも不思議ではありません。プログラムがことわざのダミーを吐き出さないのは幸運です。

&ReturnedVector[i]と同じであることに注意してくださいReturnedVector + i

これが正しい方法です。ポインターを逆参照して a を取得し、vector<MyType*>その配列インデックス演算子を呼び出してith 要素を取得します。その要素はMyType*当然のことであり、キャストする必要はありません。

// NICE!
MyType* Temp = (*ReturnedVector)[i];

いくつかのコードを投稿したので、編集してください...ベクトルを設定して関数から返すより一般的な方法は、参照によって渡すことです。そうすれば、ベクトルへのポインターや醜い逆参照を処理する必要がなくなり、後でベクトルを削除する必要がなくなります。これを試して:

void MyAPI::GetVector( vector<MyClass*> & vec )
{
    vec.clear();
    vec.reserve(100);

    for (int i = 0; i < 100; i++)
    {
        vec.push_back( new MyClass(params) );
    }
}

アップデート。この回答を書いたとき、私は戻り値の最適化にあまり詳しくありませんでした。そのため、ベクトルを返すときに発生する可能性のあるコピーについて偏執的でした。これは実際には問題ではありません。最新のアプローチは、単純にベクトルを返すことです。

vector<MyClass*> MyAPI::GetVector()
{
    vector<MyClass*> vec;
    vec.reserve(100);
    for (int i = 0; i < 100; i++)
    {
        vec.push_back( new MyClass(params) );
    }
    return vec;
}

そして、C++11 がより通常になるにつれて、私たちは生のポインターを放棄し始め、移動セマンティクスstd::shared_ptrに加えて:std::unique_ptr

vector<unique_ptr<MyClass> > MyAPI::GetVector()
{
    vector<unique_ptr<MyClass> > vec;
    vec.reserve(100);
    for (int i = 0; i < 100; i++)
    {
        vec.push_back( std::move( unique_ptr<MyClass>(new MyClass(params)) ) );
    }
    return vec;
}
于 2012-10-26T04:13:38.900 に答える
0

これを交換するだけ

for (unsigned int i = 0; i < RetVector->size(); i++)
{
    MyClass* Temp = reinterpret_cast< MyClass* >(&RetVector[i]);
    std::cout << Temp->value << std::endl;
}

while(!RetVector->empty())
{
    MyClass* Temp = RetVector->pop_back();
    std::cout << Temp->value << std::endl;
}
于 2012-10-26T06:01:01.940 に答える