2

ポインターをintに変換してから、ポインターに戻す簡単な方法が必要です。intはポインタよりもプロジェクトで持ち運びが簡単なので、移植性のためのintとして必要です。

プレーヤーを起動してポインタを返します。

SoundPlayer* player = new FxPlayerTiny();
return (int)player; // this works, but is it correct?

ポインタintを使用してプレーヤーを停止します。

FxPlayerTiny* player = static_cast<FxPlayerTiny*>((int*)num); // this gives me an error
FxPlayerTiny* player = (FxPlayerTiny*)((int*)obj); // this works, but is it correct?
delete player;
4

2 に答える 2

9

最善の方法は、プロジェクトを修正して、ポインターを処理できるようにすることです。整数とポインタは2つの異なるものです。前後に変換することはできますが、注意しないと、そのような変換によって情報が失われる可能性があります。

実装と基盤となるプラットフォームによっては、ポインター値をint再度変換すると、情報が簡単に失われる可能性があります。たとえばint、ポインタよりも小さいシステムがあります。32ビットintと64ビットのポインターがある場合、ポインターをとに変換したりint、元に戻したりすると、ほぼ確実に無効なポインターになります。

情報を失うことなく、変換されたポインタ値を保持するのに十分な幅である可能long性が非常に高いです。unsigned long私はそうでないシステムで働いたことがありません。(個人的には、符号なしの型を好む傾向がありますが、本当に正当な理由はありません。どちらも同じように機能するはずです。)

したがって、たとえば次のように書くことができます。

SoundPlayer* player = new FxPlayerTiny();
return reinterpret_cast<unsigned long>player;

unsigned longを使用して値をポインタに変換し直しますreinterpret_cast,SoundPlayer*>

新しい実装では、typedefuintptr_tintptr_t、が提供されます。これらは、ポインタから整数、ポインタへのラウンドトリップ変換で正しく機能することが保証されている符号なしおよび符号付き整数型です。これらはC99で導入され、オプション<stdint.h>でヘッダーで定義されています。(ポインターがどの整数型よりも大きい実装では定義されませんが、そのような実装はまれです。)C ++は2011標準でそれらを採用し、<cstdint>ヘッダーで定義しました。ただし、Microsoft Visual C ++は、2010バージョンの時点でそれらをサポートしています。

この保証は通常のポインターにのみ適用され、関数ポインターやメンバーポインターには適用されません。

したがって、これを行う必要がある場合は、次のように書くことができます。

#include <cstdint>
SoundPlayer* player = new FxPlayerTiny();
return reinterpret_cast<std::uintptr_t>player;

しかし、最初に、これを考慮してください。new FxPlayerTiny()あなたにポインタ値を与えます、そしてあなたはポインタ値が欲しいでしょう。可能であれば、それをポインタとして保持してください。それを整数に変換するということは、いくつかの手法のどれを使用するかを決定する必要があり、整数値が表すことになっているポインターの種類を追跡する必要があることを意味します。十分な大きさではない整数型を使用したり、格納したポインタ型を追跡できなくなったりした場合、コンパイラは警告を表示しない可能性があります。

おそらくあなたはそれをする必要がある正当な理由があります、しかしあなたがただポインターとしてポインターを保存することができればあなたの人生はずっと楽になるでしょう。

于 2013-03-24T22:20:11.067 に答える
1

移植性のためにintを使用することはお勧めしません。特に、sizeof (int)sizeof (void*)が異なる可能性があるためです(たとえば、Windows x64用にコンパイルする場合)。ユーザーインターフェイスにintが必要な場合は、ポインターのテーブルを使用し、インデックスを介してそれらにアクセスする方がよい場合があります。

ただし、ポインタを整数に変換したい場合、またはその逆の場合は、単純な変換で十分ですが、。の場合はまったく同じですsizeof *int) == sizeof (void*)

于 2013-03-24T18:41:44.507 に答える