2013-02-27 84 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是一个void *,反正是有,我可以临时更改PTR的类型,所以我没有丢每次使用它?

我不能只创建另一个类型为Foo的指针,因为ptr在其他地方使用,并且需要是void类型。所以我想,暂时把它的类型Foo,以避免我不得不做的所有凌乱的演员。

**似乎有些人感到困惑......因为在程序中它的使用这样的PTR必须保持void类型: -

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必须保持void类型。我只是想知道是否有暂时的方式将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

是的,我想唯一的办法就是创建一个临时指针。不想这样做,但仍然... – 2013-02-27 19:10:11

+2

不要害怕:编译器应该足够聪明,以避免让你的内存消耗。 'pt'是登记变量的完美候选人。 – PypeBros 2013-02-28 09:43:22

+1

为什么'void * t = ptr; //原始ptr'?从那里再次使用'ptr' ... – glglgl 2013-02-28 10:07:20

0

编辑:此答案已过时,因为原始问题已被修改。

您可以使用:

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指针。 – 2013-02-27 18:38:00

+0

多个类使用(全局?)作用域指针与他们自己的单独铸造?这听起来像道路前的恶梦,imho。 – PypeBros 2013-02-28 09:44:37

+0

线程启动程序在我的答案后编辑了他的问题,使答案过时。 – Hyndrix 2013-02-28 14:07:14