这可能是我忽略的愚蠢的简单事情,但是我正在Data::Data(char *DataType...)
函数中设置值,因为它们正传递进来,而当我将它们悬停在它们上时,它们的设置就很好(变量{ {1}}应该悬停在上面。
但是,当下面调用type, material, ID, unit, reading
函数时,当我将鼠标悬停在指针参数(getData
)上时,它们被设置为随机字符串,例如目录名和文件名。我不确定为什么会发生这种情况,因为将变量设置在上面时,它们是正确的。
我已经包含了定义所有这些函数的Data类的头文件和实现文件,但是如果我需要在其中调用它们的地方,请告诉我,我没有这样做的唯一原因是因为通话时间很短,文件中充斥着其他不相关的内容。谢谢
*type, *materials.. etc
Data.hpp
Data.cpp
#include "Data.hpp"
Sensor::Sensor(char *DataType, char *Material, int ID, char *Sensor, double Min, double Max) {
strcpy(type, Type);
strcpy(material, Material);
ID = SIDs;
strcpy(unit, Units);
max = Maxs;
min = Mins;
}
Sensor::Sensor() {}
double Data::generateData() {
reading = min + (rand() % (int)(max - min + 1));
return reading;
}
void Data::getData(char *type, char *material, int *ID, char *unit, double *reading) {
return;
}
Data::~Data(){}
答案 0 :(得分:1)
您实施的Sensor::getData
并没有您认为的那样。
让我们看一下这堂课:
class Foo
{
void getX(int* x)
{
}
int* x;
};
在getX
中,参数 x
隐藏同名的成员 x
。此函数实际上不执行任何操作:用户将指针传递到int
,该指针在此函数中的名称为x
。该成员不会自动复制到那里(这很令人惊讶,因为您可以将参数命名为其他任何名称)。如果要这样做,则必须明确地做到这一点:
void getX(int* x)
{
*x = *this->x; // Pointed-to value is copied
//x = this->x; // Pointer is copied
}
如果您未将function参数设置为任何值,则指针将始终指向内存中的随机垃圾,这是您在调试器中看到的。
表示“此参数将由此函数更改/设置”的更常见方式是传递引用:
class Foo
{
void get(char*& x, int*& y, double& z)
{
x = this->x; // Now both parameter and member point to the same location.
y = this->y; // Now both parameter and member point to the same location.
z = this->z;
}
char x[32];
int* y;
double z;
};
或者,如果您不想复制指针,而是复制指向值:
void get(char* x, int* y, double& z)
{
strcopy(x, this->x);
*y = *this->y;
z = this->z;
}
(PS:如果您的用例允许,我建议使用std::string
而不是char数组。)
答案 1 :(得分:0)
无论是否调用getData()
,未初始化的参数都会设置为随机垃圾。尝试将其打印出来,而不用调用getData()
来查看。