gpt4 book ai didi

c++ - 如何将对象*作为 void*& 传递?

转载 作者:行者123 更新时间:2023-11-28 08:03:00 24 4
gpt4 key购买 nike

我有以下代码:

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 是我遇到问题的论点,但我不知道该怎么做才能让它发挥作用。

最佳答案

如您的代码所述,您有一个 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 绕过所有编译器帮助进行类型检查,这是非常危险的,如果你必须使用它,你要么是非常错误的,要么有一个非常讨厌的问题(这可能源于你的方法是 非常错误)。请注意源代码周围的常量,无论何时您想要复制和完好无损的东西,这都是一个很好的做法。

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

关于c++ - 如何将对象*作为 void*& 传递?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10903952/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com