在c ++中传递参数的问题(指针让我困惑)

时间:2010-01-06 07:45:05

标签: c++ pointers

我编写了一个程序,它将一些数据存储在一个结构中,我将把结构传递给其他程序,如下所示

slotUpdate(Datas);

虽然我已经定义了这样的结构:

someNameSpace::stuData Datas;

将结构再次传递给slotUpdate后,我会将它传递给另一个过程,但这次作为参数和(void *)如下:

updateDB(void * parameter){
anotherNameSpace::someFucntion((stuData *) parameter);
}

注意:我将数据传递给updateDb,如下所示:updateDB(& Datas);

当我尝试从这个结构中检索数据时进入someFunction我不成功,我会得到错误的数据,垃圾: - ?

这里我的问题是什么?

3 个答案:

答案 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 ++还有其他更好的机制。