2016-12-07 9 views
-3

У меня есть функция Quit, которая получает пустоту **, и мне нужно передать ее новой функции, получающей DataStructure *.void * не является указателем на тип объекта - Ошибка литья из void **

Проблема в том, что данные в ds заменяются мусором. Что я могу сделать ?

void Quit(void** DS){ 
     DataStructure* ds = (DataStructure*) *DS; 
     return ds->Quit(); //'void*' is not a pointer to object type 
} 

когда определение второй Quit() является:

void DataStructure::Quit(); 

и вызов в основном делаются следующим образом:

DataStructure *data; 
Quit((void**) &ds); 

Мы получаем тот же результат, если мы бросим следующим образом:

DataStructure* ds = reinterpret_cast<DataStructure*>(*DS);  
+1

'((структура данных *) * DS);' выглядит как NOP. –

+2

вам необходимо предоставить полную ошибку компиляции и/или полный пример –

+0

Если 'data' не указывает на действительную' DataStructure', вы не можете ожидать, что что-то будет работать. – molbdnilo

ответ

1

Если ваш DS переменная фактически является DataStructure* вы можете просто бросить его:

void Quit(void** DS) 
{ 
     DataStructure* ds = (DataStructure*)DS; 
     return ds->Quit(); 
} 
2

Отлитые работы, он просто не изменяет тип DS, как вы ожидаете, что делать.

((DataStructure*)* DS) преобразует значение *DS и отбрасывает результат.
(Ваш компилятор может предупредил вас, что это не имеет никакого эффекта.)

Вам нужно сохранить результат преобразования:

void Quit(void** DS){ 
     DataStructure* ds = (DataStructure*) *DS; 
     return ds->Quit(); 
} 
+1

или лучше yer, 'DataStructure * ds = reinterpret_cast (* DS);' – YSC

+0

Он передает компиляцию, но я теряю то, что было в DS (для каждого ответа). Я не хочу потерять эти данные. Действительно, DS имеет тип DataStructure **, но моя функция становится только void **. –

+0

@ R.Gad Опубликовать код, создающий этот 'void **'. – molbdnilo