我的问题是关于定义到类中的变量。我告诉你我的问题。
我定义了这个类:
class Measure {
int N;
double measure_set[];
char nomefile[];
double T;
public:
void get( );
void printall( );
double mean( );
double thermal_comp( );
};
我希望方法可以执行以下操作:
以下是我所做的:
void Measure::get()
{
cout << "Insert filename:" << endl;
cin >> nomefile;
cout << endl;
cout << nomefile << endl;
cout << endl;
int M=0;
int nmax=50;
ifstream f;
f.open(nomefile);
while(M<nmax)
{
f >> measure_set[M];
if(f.eof())
break;
M++;
}
f.close();
N=M+1;
cout << "Insert temperature:" << endl;
cin >> T;
cout << endl;
}
发生的事情是我注意到T被记忆在measure_set[0]
中。为什么会发生这种情况?如何编写有效的代码?我不是C ++方面的专家,仅将其用于计算目的,虽然我可以通过其他方式解决我的问题,但我想学习如何在C ++中使用它。非常感谢!
答案 0 :(得分:5)
在C和C ++中,在多个范围内使用相同名称是合法的 - 一些编译器(例如gcc -Wshadow)将提供一种警告您的机制,因为它可能导致混淆。
#include <iostream>
int i = 0;
int main() {
int i = 1;
for (int i = 0; i < 10; ++i) {
int i = 2 * i;
std::cout << i << std::endl;
}
return 0;
}
有些编译器会编译它并输出'0,2,4,6,8 ......'。 Some won't
避免这种情况的常用方法是使用前缀。 “m_”表示“成员”,“s_”表示“静态”,“g_”表示“全局”等。某些编码样式对成员变量使用“_”后缀。这也有助于防止成员变量与类似命名的getter / setter冲突,如果这是你的骆驼滚动的方式。
class Measure {
int m_n;
double m_measureSet[MEASURE_SET_SIZE]; // [] is not legal in a class.
std::string m_nomefile;
double m_t;
public:
const std::string& nomefile() const { return m_nomefile; }
...
};
如果这种回报在使用中,我倾向于发现鼓励开发人员使用访问者而不是成员(最后添加()似乎比在开头键入“m_”更容易。
std::cout << "Measuring file " << nomefile << std::endl;
会变成
std::cout << "Measuring file " << m_nomefile << std::endl;
或更好:
std::cout << "Measuring file " << nomefile() << std::endl;
答案 1 :(得分:-1)
您对Measure类成员的声明:
double measure_set[];
char nomefile[];
声明数组而不声明数组中的元素数。这不是合法的C ++,虽然显然有些编译器会支持它。
如果你想要动态大小的数组,请使用std :: vector,或者自己分配和释放数组内存,例如。
//Declaration
double* measure_set;
//Allocation
unsigned int arrayLen = 10;
measure_set = new double[arrayLen];
//Assigning values to array elements
for(int i = 0; i < arrayLen; ++i) {
measure_set[i] = 0;
}
//Freeing allocated memory
delete[] measure_set;
您当前的代码:
measure_set[M];
引用未分配任何内存的数组中的数组元素。如果预先分配数组内存,只要你没有写过数组的边界就可以了。
使用std :: vector(动态大小的数组),您可能希望使用push_back或emplace_back函数将值插入向量,而不是使用方括号运算符赋值。
此外,在使用向量时,您可能还想使用保留函数(等)预先分配基础数组,以避免调整向量大小的代价高昂的操作。