阴影变量

时间:2013-10-27 18:31:12

标签: c++

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

我定义了这个类:

class Measure {

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

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

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

  1. 从.dat文件中读取数字并保存到measure_set数组中;
  2. 读取用户输入并将其保存到变量T;
  3. 以下是我所做的:

    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 ++中使用它。非常感谢!

2 个答案:

答案 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函数将值插入向量,而不是使用方括号运算符赋值。

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