1

我的问题是关于定义到类中的变量。我告诉你我的问题。

我已经定义了这个类:

class Measure {

int N;
double measure_set[];
char nomefile[];
double T;

public:
    void get( );
    void printall( );
    double mean( );
    double thermal_comp( );
};

我希望方法 get 执行以下操作:

  1. 从 .dat 文件中读取数字并保存到 measure_set 数组中;
  2. 读取用户输入并将其保存到变量 T 中;

这是我所做的:

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++ 中使其工作。非常感谢!

4

2 回答 2

6

在 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, ...'。有些不会

避免这种情况的常用方法是使用前缀。“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;
于 2013-10-27T19:01:32.710 回答
-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 函数将值插入向量中,而不是使用方括号运算符分配值。

此外,在使用向量时,您可能还需要预先分配底层数组,使用保留函数(等)来避免调整向量大小的代价高昂的操作。

于 2018-05-03T01:44:58.010 回答