【问题标题】:Permanently changing a pointer type永久更改指针类型
【发布时间】:2013-02-27 18:22:44
【问题描述】:

我需要知道是否真的有一种方法可以轻松做到这一点。这只是我想做的一个例子......

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

【问题讨论】:

    标签: c++ pointers


    【解决方案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;
    

    【讨论】:

    • 是的,我想唯一的方法就是创建一个临时指针。不想这样做,但仍然......
    • 不要害怕:编译器应该足够聪明以避免消耗你的内存。 'pt' 是注册变量的完美候选者。
    • @glglgl 当然!!目的只是为了表明 ptr 仍然具有 void* 类型 :-) ,您可以像以前一样使用它
    【解决方案2】:

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

    你可以使用:

    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;
    

    【讨论】:

    • 感谢您的回复,但它并没有真正回答问题。 ptr 必须保持 void 类型,因为它分配了不同的类,我只是想避免一直强制转换 void 指针。
    • 多个类使用(全局?)范围指针和它们自己的单独转换?这听起来像是前方的噩梦,恕我直言。
    • 主题发起人在我回答后编辑了他的问题,这使得答案过时了。
    猜你喜欢
    • 1970-01-01
    • 2017-02-27
    • 1970-01-01
    • 2020-08-13
    • 1970-01-01
    • 1970-01-01
    • 2011-12-31
    • 2012-02-16
    • 2016-01-10
    相关资源
    最近更新 更多