2013-10-27 2 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_» для «global» и т. д. В некоторых стилях кодирования используется суффикс «_» для переменных-членов. Это также помогает предотвратить зависание переменных-членов с помощью так называемых геттеров/сеттеров, если это так, как ваш каток вертится.

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; 
Смежные вопросы