Разыменование массива пустых указателей - PullRequest
1 голос
/ 13 марта 2012

Скажем, у меня есть массив указателей void, указывающих на объекты разных типов, и я хочу передать их через функцию и привести их к указателям их соответствующего типа, как мне поступить?Я пробовал этот текущий код, но я получаю сообщение об ошибке:

'void *' не является указателем на тип объекта

objectA myObjectA;
objectB myObjectB;
objectC myObjectC;
objectD myObjectD;

void *data[4];

data[0] = static_cast<void *>( &myObjectA );
data[1] = static_cast<void *>( &myObjectB );
data[2] = static_cast<void *>( &myObjectC );
data[3] = static_cast<void *>( &myObjectD );

void dereference( void *data )
{
    objectA *objA_ptr = static_cast<objectA *>( data[0] );
    objectB *objB_ptr = static_cast<objectB *>( data[1] );
    objectC *objC_ptr = static_cast<objectC *>( data[2] );
    objectD *objD_ptr = static_cast<objectD *>( data[3] ); 
}

Кто-нибудь знаетправильный способ реализовать это?

edit: Для контекста я использую opencv и пытаюсь создать простой графический интерфейс с трекбаром.Opencv позволяет передавать пользовательские данные в TrackbarCallback, который вызывается при перемещении ползунка, но только в виде пустого указателя.

 int createTrackbar( const string& trackbarname, const string& winname,
                           int* value, int count,
                           TrackbarCallback onChange=0,
                           void* userdata=0); 

Ответы [ 4 ]

7 голосов
/ 13 марта 2012

скажем, у меня есть массив пустых указателей

void deference( void *data )

Это не массив пустых указателей, это единственный указатель на пустоту.

Измените это на void **, и затем, так как вы все равно смешиваете стили C и C ++, почему бы просто не использовать приведение стиля C? :

objectA *objA_ptr = (objectA *) data[0];
3 голосов
/ 13 марта 2012
  1. Получите их все из одного базового класса.

  2. сделайте деструкторы виртуальными, если ваша функция должна их удалить.

  3. сделай свой массив BaseClass *data[4]

  4. сделай свою функцию void deference(BaseClass **data)

2 голосов
/ 13 марта 2012

Вы можете использовать reinterpret_cast<>() вместо static_cast<>.

0 голосов
/ 13 марта 2012

Правильный прототип функции должен быть

void dereference(void **data)

, поскольку вы передаете массив void *, и, как мы все знаем в C и C ++, выражение массива заменяется выражением указателя вбольшинство обстоятельств.

Есть ли какая-то особая причина, по которой вы должны использовать массив указателей на объекты разных классов?Это пахнет как решение C проблемы C ++.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...