0

我有以下代码:

void testCopy(){
   Balloon* b1=new Balloon(1,5,6,3);
   Balloon* b2=new Ballon(2,4,4,2);
   cpyBallon(b1,b2);
   assert(b1->getCenterx()==5);
   cout<<" cpyBalloon() OK!\n";
}

cpyBalloon() 的代码是

void cpyBalloon(TCE& dest,TCE src){
    Balloon* b=(Balloon*) src;
    Balloon* d=new Balloon();
    *d=*b;
    dest=d;
}

其中 TCE if 类型为 void*。问题是我不知道如何将Balloon* 类型的对象b2 作为void*& 传递。我不断收到以下错误:

    ..\src\/Domain/BalloonTest.h:68:18: error: invalid initialization of reference of type 'void*& {aka void*&}' from expression of type 'domain::Balloon*'
    ..\src\/Domain/Balloon.h:102:10: error: in passing argument 1 of 'void domain::delBalloon(void*&)'    

我知道 b2 是我遇到问题的论点,但我不知道该怎么做才能使它起作用。

4

2 回答 2

1

正如您的代码所述,您有一个 Balloon 类。您已经为两个 Balloon 实例动态分配了内存并调用了它们的构造函数,用各自的数据填充它们。然后,您将每个对象的地址存储到适当的原始指针中。

这种类型定义:

typedef void* TCE; // why?

是没有意义的。void*对( )的引用void*&也是没有意义的。为什么?因为void*只保存一个值 - 字节流的第一个字节(当您将任何内容解释为 时void*,它们的计数会丢失,这是因为计数与类型相关)。所以,它已经是一个指针。您没有传递整个字节流,只是第一个字节的地址。然后您可以根据需要在函数中进一步解释它。

但在这种情况下,没有必要这样解释。当从非常低的级别分析时,引用只是变相的指针,使我们能够安全地获得指针的好处(无需过多考虑)。还有更多,但就目前而言,这很重要。

您可以:

  1. 在堆栈上(本地)创建实例并将其作为引用传递。
  2. 在堆上创建实例并获取内存地址,将它们传入并进一步处理。
  3. 或者...您可以采取行动 2 并将它们转换为void*,然后撤消函数中的转换(无论这样做有什么好处)。

先观察:

    Balloon b1(1,5,6,3);
    Balloon b2(2,4,4,2);

    cpyBalloon(b1, b2);

    void cpyBalloon(Balloon& dest, const Balloon& src) 
    {
        dest = src; // invokes the assignment copy operator (imp. generated)
    }

观察二:

    Balloon* b1 = new Balloon(1,5,6,3);
    Balloon* b2 = new Balloon(2,4,4,2);

    cpyBalloon(b1, b2);

    void cpyBalloon(Balloon* dest, const Balloon* src) 
    {
        *dest = *src; // invokes the assignment copy operator (imp. generated)
    }

观察第三个(亲爱的主……):

    Balloon* b1 = new Balloon(1,5,6,3);
    Balloon* b2 = new Balloon(2,4,4,2);

    cpyBalloon((void*)b1, (void*)b2);

    void cpyBalloon(void* dest, const Balloon* src) 
    {
        *(Balloon*)dest = *(const Balloon*)src; // oh god...
    }

您还可以 reinterpet_cast 绕过所有编译器对类型检查的帮助,这是非常危险的,如果您必须使用它,那么您要么非常错误,要么遇到了一个非常讨厌的问题(这可能源于您的方法非常错误)。请注意const源周围的情况,当您想要复制和完好无损的东西时,这是一种很好的做法。

另请注意,在这些情况下会出现很多内存管理,这只是一个简单的情况。

于 2012-06-05T20:45:19.847 回答
0

您不能将 type 的左值T*(其中Tis not void)作为 type 的参数传递void *&。这是语言不允许的。仅仅因为任何数据指针类型都可以转换为void *并不意味着任何数据指针类型都可以转换为void *&。这些是完全不同的东西。

如果你真的想这样做,你必须void *&通过使用强制转换为reinterpret_cast. 但是,您似乎试图执行的操作并没有多大意义。即使您的代码可能被迫通过使用“工作” reinterpret_cast,它仍然是一个黑客。

于 2012-06-05T20:23:04.247 回答