2013-10-27 75 views
0

我的问题是关于定义为类的变量。我告诉你我的问题。影子变量

我已经定义了这个类:

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中;

这里是我做了什么:

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++进行这项工作。非常感谢!

+3

这不是有效的C++代码。如果你想要一个动态大小的数组,可以使用'std :: vector'。 – rightfold

+0

谢谢你们,最大的错误是在类头中定义该向量[],我不知道它无法完成。其他建议对编写更好的代码也很有用。再次感谢! ^^ –

回答

3

在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_”表示“member”,“s_”表示“static”,“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;