2013-02-27 86 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