我编写了一个程序,它将一些数据存储在一个结构中,我将把结构传递给其他程序,如下所示
slotUpdate(Datas);
虽然我已经定义了这样的结构:
someNameSpace::stuData Datas;
将结构再次传递给slotUpdate后,我会将它传递给另一个过程,但这次作为参数和(void *)如下:
updateDB(void * parameter){
anotherNameSpace::someFucntion((stuData *) parameter);
}
注意:我将数据传递给updateDb,如下所示:updateDB(& Datas);
当我尝试从这个结构中检索数据时进入someFunction我不成功,我会得到错误的数据,垃圾: - ?
这里我的问题是什么?
答案 0 :(得分:5)
在您对slotUpdate的调用中,您传递的是“数据”而非“&数据”。您没有向我们提供slotUpdate的声明,但可以通过以下两种方式之一声明它:
void slotUpdate(stuData& Data);
void slotUpdate(stuData Data);
如果函数IS是第一种定义的,那我就不明白了。然而,第二种方式是通过值语义传递: - slotUpdate将写入Data结构的本地副本,这个传入的结构将不会更新,因此,它将包含它开始的相同垃圾当slotUpdate返回时。然后您将传递给其他函数。
将slotUpdate的定义更改为以下之一: -
void slotUpdate(stuData* pData);
void slotUpdate(stuData& Data);
我更喜欢第一个表单,因为它明确表示您正在传递指向要更改的结构的指针。第二种形式使得难以理解 - 正如你的帖子中显而易见的那样 - 是否正在使用按值传递或通过引用语义传递。
答案 1 :(得分:1)
我无法分辨你所写的内容和顺序。失败发生在someFucntion()吗?
结构是否应该由slotUpdate()填充,如果是,你是否定义了slotUpdate()来接受引用参数(例如,void slotUpdate(someNameSpace::stuData &Datas);
?)
答案 2 :(得分:1)
你是否有可能在两个名称空间中都有两个不同的StudData,并且当你使用它时你会使用不正确的StudData?
另一点,仅仅是为了改进:在C ++中使用C样式转换(如(data *))不是一个好习惯,最好在适当的地方使用static_cast / dynamic_cast等。所以你可以在你的例子中使用static_cast()。
另外,在C中转换为void *和back是正常的,因为这是启用抽象/泛型编程的原因,但是C ++还有其他更好的机制。