0

私が得ている正確なエラーは次のとおりです。

'object' (タイプ 'void*') をタイプ 'class udDator(int)*' に dynamic_cast できません (ソースはクラスへのポインタではありません)

これは、オーバーライドされたオペレーターの削除内で発生しています。参照を通じてメモリを管理し、他のクラスに継承できるテンプレート化されたメモリ管理クラスを作成しようとしています。これは、スマートな shared_ptr のようなものの代わりになり、メモリ管理をさらに目立たなくする試みであり、余分な入力は必要ありません ( shared_ptr< someClass > shared( new someClass() ) はちょっと長い... )。

とにかく、ここに関連するコードがあります。詳細について言及するのを忘れた場合、または確認する必要があるコードがない場合は、お知らせください。

オーバーライドされた演算子:

template< class T >
class udSharedMemory
{
public:
    void operator delete( void *object )
    {         
        T *temp = dynamic_cast< T* >( object ); //<------ ERROR!
        assert( temp && "Something went wrong during casting" );
        temp->release();
    }
}

テンプレート化されたクラス:

template< class T >
class udDator : public udMemoryManaged, public udSharedMemory< udDator< T > >
{
// stuff
};

テンプレート化されたクラスの使用法:

udDator< int > *test = new udDator< int >( "5" );
4

3 に答える 3

4

C++ では、特定の多相型のオブジェクトのアドレスがポインターに実際に含まれているかどうかを確認する方法がありません。

ベースの 1 つへのポインターが必要です。たとえば、1 つのポリモーフィック インターフェイスから関連するすべてのオブジェクトを派生させ、void ポインターを取得してそのインターフェイスにキャストすると、そこからランタイム チェックを実行するために必要な型に動的にキャストできます。

于 2010-07-01T05:31:52.907 に答える
2

動的キャストにはポリモーフィックな動作が必要ですが、ありvoidません。static_cast代わりにaを使用してください。

于 2010-07-01T05:28:56.937 に答える
0

dynamic_castオブジェクトへのポインターと参照でのみ使用できます。その目的は、型変換の結果が要求されたクラスの有効な完全なオブジェクトであることを確認することです。

http://www.cplusplus.com/doc/tutorial/typecasting/

于 2010-07-01T05:31:05.777 に答える