2013-02-27 4 views
1

Мне нужно знать, есть ли на самом деле способ сделать это легко. Это просто пример того, что я хочу сделать ...Постоянное изменение типа указателя

void* ptr; 
ptr = new Foo; 
((Foo*)ptr)->member1 = some_val; 
((Foo*)ptr)->member2 = some_val; 
((Foo*)ptr)->member3 = some_val; 
((Foo*)ptr)->member4 = some_val; 
((Foo*)ptr)->member5 = some_val; 
((Foo*)ptr)->member6 = some_val; 

Поскольку PTR пустота *, есть в любом случае, что я могу временно изменить тип PTR, так что я не должен бросить его каждый раз использовать его?

Я не могу просто создать другой указатель типа Foo, потому что ptr используется в другом месте и должен быть типа void. Поэтому, я думаю, временно сделайте это типа Foo, чтобы избежать всех беспорядочных кастингов, которые мне нужно делать.

** Кажется, некоторые люди путаться ... PTR должны оставаться типа пустоте, потому что в программе используется так: -

void* ptr; 
switch (bar) 
{ 
    case 1: 
     ptr = new Foo; 
     ((Foo*)ptr)->member1 = some_val; 
     ((Foo*)ptr)->member2 = some_val; 
     ((Foo*)ptr)->member3 = some_val; 
     ((Foo*)ptr)->member4 = some_val; 
     ((Foo*)ptr)->member5 = some_val; 
     ((Foo*)ptr)->member6 = some_val; 
    case 2: 
     ptr = new Doo; 
     ... 
    case 3: 
     ptr = new Scooby; 
     ... 

Так, PTR должен оставаться типа пустоты. Я просто хотел узнать, есть ли временный способ для переноса ptr на другой тип, поэтому избегайте отливки ...

ответ

1

Я не понимаю, почему вы не можете создать временную указатель:

void* ptr; 
ptr = new Foo; 
{ 
Foo *pt=(Foo*)ptr; 
pt->member1 = some_val; 
pt->member2 = some_val; 
pt->member3 = some_val; 
pt->member4 = some_val; 
pt->member5 = some_val; 
pt->member6 = some_val; 
} 
void *t=ptr; // the original ptr 

Иногда я использую:

Foo &f= *((Foo*)ptr); 
f.member1 = some_val; 
f.member2 = some_val; 
f.member3 = some_val; 
f.member4 = some_val; 
f.member5 = some_val; 
f.member6 = some_val; 
+0

Да, я думаю, единственный способ создать временный указатель. Не хотел этого делать, но все же ... –

+2

Не бойтесь: компилятор должен быть достаточно умным, чтобы избежать потребления памяти. «pt» является идеальным кандидатом на переменную in-register. – PypeBros

+1

Почему 'void * t = ptr; // оригинальный ptr'? Просто используйте 'ptr' снова оттуда на ... – glglgl

0

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

Вы можете использовать:

Foo* ptr; 

ptr = new Foo; 
ptr->member1 = some_val; 
ptr->member2 = some_val; 
ptr->member3 = some_val; 

или

void* ptrFromElseWhere; 
Foo* ptr = static_cast<Foo*>(ptrFromElseWhere); 

ptr->member1 = some_val; 
ptr->member2 = some_val; 
ptr->member3 = some_val; 
+0

Спасибо за ответ, но на самом деле он не отвечает на вопрос. ptr должен оставаться от типа void, поскольку он назначил разные классы, я просто хочу избежать необходимости постоянно указывать указатель void. –

+0

Несколько классов с использованием (глобальной?) Области указателя с их собственным индивидуальным литьем? это похоже на кошмары впереди дороги, имхо. – PypeBros

+0

Редактор темы отредактировал свой вопрос после моего ответа, который делает ответ устаревшим. – Hyndrix

Смежные вопросы