【问题标题】:problem in passing parameters in c++ (pointers confused me)在 C++ 中传递参数的问题(指针让我很困惑)
【发布时间】:2010-01-06 07:45:04
【问题描述】:

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

slotUpdate(Datas);

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

someNameSpace::stuData Datas;

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

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

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

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

我的问题是什么?

【问题讨论】:

  • 感谢大家的尊重和有益的回答。但问题出在结构的定义内部,因为我想将结构作为指针传递给其他函数以及其他对象。我必须为它定义一个构造函数,否则结构在遍历过程中不会保存它的数据。问候。

标签: c++ pointers


【解决方案1】:

在您对 slotUpdate 的调用中,您传递的是“Data”而不是“&Data”。你没有给我们 slotUpdate 的声明,但它可以通过以下两种方式之一声明:

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

如果函数是按第一种方式定义的,那么我不明白。然而,第二种方式是按值传递语义:- slotUpdate 将写入 Data 结构的 local 副本,这个传入的结构将不会被更新,因此将包含它开始的相同垃圾当 slotUpdate 返回时。然后将其传递给其他函数。

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

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

我更喜欢第一种形式,因为它明确表明您正在传递指向要更改的结构的指针。第二种形式让人难以理解 - 正如您的帖子中所表明的那样 - 使用的是按值传递还是按引用传递语义。

【讨论】:

    【解决方案2】:

    我无法从您所写的内容中看出正在发生的事情以及发生的顺序。失败是否发生在 someFucntion() 内部?

    结构是否应该由 slotUpdate() 填充,如果是,您是否定义 slotUpdate() 以接受引用参数(例如,void slotUpdate(someNameSpace::stuData &Datas);?)

    【讨论】:

    • 是的 someFunction 将操纵数据,但由于它有副本,我相信那里没有问题,当我将结构转换为 (void*) 时问题就开始了。
    【解决方案3】:

    是否有可能您在两个命名空间中都有两个不同的 StudData,而您在使用它时转换到了不正确的那个?

    另外一点,只是为了改进:在 C++ 中,使用 C 样式转换(如 (data*))不是一个好习惯,最好在适当的情况下使用 static_cast/dynamic_cast 等。所以你可以在你的例子中使用 static_cast() 。

    此外,在 C 中强制转换为 void* 和向后是可以的,因为这是启用抽象/泛型编程的原因,但 C++ 有其他更好的机制。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-04-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多