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 转换为另一种类型,因此请避免转换...

4

2 回答 2

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;
于 2013-02-27T18:46:48.673 回答
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;
于 2013-02-27T18:25:12.087 回答