2010-01-06 158 views
1

我已经写这将一些数据存储在结构内部和我将结构传递给其它过程如下面问题++(指针混淆我)

slotUpdate(Datas); 

而I”的过程

:使结构slotUpdate再次我将它传递给另一程序,但此时作为参数,并如(无效*),如以下后

someNameSpace::stuData Datas; 

:VE定义如结构

注意:我通过数据更新db这样的:updateDB(& Datas);

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

这里有什么问题?

+0

感谢大家的尊重和有益的答案。 但问题出在结构的定义里面,因为我想把结构作为指针传递给其他函数以及其他对象。我必须为它定义一个构造函数,否则在遍历期间结构将不保存它的数据。 关于。 – 2010-01-06 10:54:03

回答

1

我无法从你所写的内容中知道发生了什么以及按照什么顺序。 someFucntion()内发生故障吗?

应该由slotUpdate()填写的结构,如果是这样,你定义slotUpdate()接受一个基准参数(例如,void slotUpdate(someNameSpace::stuData &Datas);?)

+0

是someFunction将操纵数据,但因为它有我认为这里没有问题的副本,当我将结构投射到(void *)时,问题就开始了。 – 2010-01-06 08:13:59

1

有没有可能是你有两个不同的StudData在两个命名空间中,并且在使用它时投射到不正确的那个?另一点,只是为了重构:在C++中,使用C风格转换(如(data *))并不是一个好习惯,最好是在适当的地方使用static_cast/dynamic_cast等。所以你可以在你的例子中使用static_cast()。

另外,在C中抛出void *和backward是可以的,因为这是启用抽象/泛型编程的原因,但C++有其他更好的机制。

5

在您拨打slotUpdate时,您传递的是“数据”而不是“&数据”。你没有带给了我们slotUpdate的声明,但它可以通过以下两种方式之一进行申报:

void slotUpdate(stuData& Data); 
void slotUpdate(stuData Data); 

如果函数定义的第一种方式的话,我不明白。然而,第二种方法是通过值语义传递: - slotUpdate将写入到一个本地拷贝的数据结构中,这个结构中传递的数据将不会被更新,因此将包含它在slotUpdate返回时启动的相同垃圾。然后你会传递给其他功能。

您slotUpdate的定义更改为以下之一: -

void slotUpdate(stuData* pData); 
void slotUpdate(stuData& Data); 

我更喜欢第一种形式,因为它使明确的,你传递一个指针要更改的结构。第二种形式很难理解 - 正如您在文章中明显的那样 - 是否使用按值传递或传递引用语义。