3

コールバックにパラメーターを渡す手段として void ポインターのみをサポートするコールバック関数で、void ポインターをクラスの配列に変換しようとしています。

class person
{
    std::string name, age;
};
void callback (void *val)
{
    for (int i = 0; i < 9; i++)
    {
        std::cout << (person [])val[i].name;
    }
}
int main()
{
    person p[10];
    callback((void*)p);
}

私の目標は、クラスの配列をコールバックに渡してperson、名前や年齢などのデータを出力できるようにすることです。ただし、コンパイルは私がやっていることを気に入らず、error: request for member 'name' in 'val', which is of non-class type 'void*'どうすればこれを行うことができますか?

4

3 に答える 3

4

サイズを回復できるようにしたい場合は、実行時にサイズを追跡するコンテナーを使用する必要があります。生の配列の代わりに std::vector を使用することをお勧めします。

std::vector<person> p(10);
static_cast<std::vector<Person>*>(val);
于 2012-06-17T04:27:35.950 に答える
0

にキャストする必要がありますperson *。配列はポインターに分解されるため、void ポインターのポインターへのキャストはperson期待どおりに機能します。明確で、より C++ で、より良い方法は次のようになります。

std::cout << static_cast<person *>(val) [i].name;

C の方法も機能しますが、追加の括弧が必要であり、適切なキャストが利用できる場合は非常に危険/悪です:

std::cout << ((person *)val) [i].name;
于 2012-06-17T03:18:10.557 に答える
0

以下のコードは機能します。しかし、配列のサイズをどのように知るのでしょうか?

void callback(void* p)
{

    Person* person = static_cast<Person*>(p);
    for ( int i = 0; i < 10; ++i)
        std::cout << person[i].age_m << "\n";
}
于 2012-06-17T03:25:23.403 に答える