2015-07-22 3 views
-1

У меня возникла следующая проблема с этим кодом.error C3861: идентификатор не найден

#include <iostream> 
#include <string> 
#include <vector> 
#include <algorithm> 
#include <iomanip> 

////////////////////////////////////////////////////////// 
//////////////////////////CORE CLASS////////////////////// 
////////////////////////////////////////////////////////// 
class Core { 
public: 
    Core() : midterm(0), final(0) { } 
    Core(std::istream& is) { read(is); } 

    std::string name() const; 

    virtual std::istream& read(std::istream&); 
    virtual double grade() const; 
protected: 
    std::istream& read_common(std::istream&); 
    std::istream& read_hw(std::istream&, std::vector<double>&); 
    double midterm, final; 
    std::vector<double> homework; 
private:  
    std::string n; 
}; 

std::string Core::name() const { return n; } 

double Core::grade() const 
{ 
    return calc_grade(midterm, final, homework); 
} 

std::istream& Core::read_common(std::istream& in) 
{ 
    in >> n >> midterm >> final; 
    return in; 
} 

std::istream& Core::read(std::istream& in) 
{ 
    read_common(in); 
    read_hw(in, homework); 
    return in; 
} 

std::istream& Core::read_hw(std::istream& in, std::vector<double>& homework) 
{ 
    double input; 
    while (in >> input) 
     homework.push_back(input); 

    return in; 
} 

////////////////////////////////////////////////////////// 
//////////////////////////GRAD CLASS////////////////////// 
////////////////////////////////////////////////////////// 
class Grad : public Core { 
public: 
    Grad() : thesis(0) { } 
    Grad(std::istream& is) { read(is); } 

    double grade() const; 
    std::istream& read(std::istream&); 
private: 
    double thesis; 
}; 

std::istream& Grad::read(std::istream& in) 
{ 
    read_common(in); 
    in >> thesis; 
    read_hw(in, homework); 
    return in; 
} 

double Grad::grade() const 
{ 
    return std::min(Core::grade(), thesis); 
} 

////////////////////////////////////////////////////////// 
//////////////////////MISCELLANEOUS/////////////////////// 
////////////////////////////////////////////////////////// 
bool compare_grades(const Core& c1, const Core& c2) 
{ 
    return c1.grade() < c2.grade(); 
} 

bool compare_Core_ptrs(const Core* cp1, const Core* cp2) 
{ 
    return compare_grades(*cp1, *cp2); 
} 

double calc_grade(double midterm, double final, std::vector<double>& homework) 
{ 
    double result = 0.0; 
    for (std::vector<double>::const_iterator i = homework.begin(); i != homework.end(); ++i) 
     result += *i; 

    return midterm*0.4 + final*0.4 + (result/homework.size())*0.2; 
} 

using namespace std; 

int main() 
{ 
    vector<Core*> students; 
    Core* record; 
    char ch; 
    string::size_type maxlen = 0; 

    while (cin >> ch) 
    { 
     if (ch == 'U') 
      record = new Core; 
     else 
      record = new Grad; 
     record->read(cin); 
     maxlen = max(maxlen, record->name().size()); 
     students.push_back(record); 
    } 

    sort(students.begin(), students.end(), compare_Core_ptrs); 

    for (vector<Core*>::size_type i = 0; i != students.size(); ++i) 
    { 
     cout << students[i]->name() << string(maxlen + 1 - students[i]->name().size(), ' '); 
     try 
     { 
      double final_grade = students[i]->grade(); 
      streamsize prec = cout.precision(); 
      cout << setprecision(3) << final_grade << setprecision(prec) << endl; 
     } 
     catch (domain_error e) 
     { 
      cout << e.what() << endl; 
     } 
     delete students[i]; 
    } 
    return 0; 
} 

ошибка C3861: 'calc_grade': идентификатор не найден. Я попытался переместить функцию перед классами, но ничего не изменилось. Я не понимаю, что не так. Помогите.

+0

Пожалуйста, опубликовать [MCVE] (http://stackoverflow.com/help/mcve). –

+0

Выглядит довольно близко к MCVE для меня. – marsh

+1

@marsh Что? 144 loc, чтобы продемонстрировать неправильный порядок декларации, далек от минимального. [Это] (http://coliru.stacked-crooked.com/a/e05d2fa9481a9e60) было бы минимальным примером для его проблемы. –

ответ

2

Вам необходимо переместить calc_grade выше класса, чтобы он знал, что он существует. Или объявите его выше, как это.

double calc_grade(double midterm, double final, std::vector<double>& homework); 

Ваш метод оценки отмечен как const, поэтому он не может изменить ваш класс. Но вы вызываете calc_grade, который не принимает вектор const, потому что он может изменить член класса, которому вы его передаете. Вы можете заставить его взять вектор const, чтобы решить эту проблему. Я бы сделал этот метод const так же, чтобы сохранить согласованность.

Одно из возможных решений:

#include <iostream> 
#include <string> 
#include <vector> 
#include <algorithm> 
#include <iomanip> 

////////////////////////////////////////////////////////// 
//////////////////////////CORE CLASS////////////////////// 
////////////////////////////////////////////////////////// 
class Core { 
public: 
    Core() : midterm(0), final(0) { } 
    Core(std::istream& is) { read(is); } 

    std::string name() const; 

    virtual std::istream& read(std::istream&); 
    virtual double grade() const; 
protected: 
    std::istream& read_common(std::istream&); 
    std::istream& read_hw(std::istream&, std::vector<double>&); 
    double midterm, final; 
    std::vector<double> homework; 
private:  
    std::string n; 
}; 

std::string Core::name() const { return n; } 


double calc_grade(double midterm, double final, const std::vector<double>& homework) 
{ 
    double result = 0.0; 
    for (std::vector<double>::const_iterator i = homework.begin(); i != homework.end(); ++i) 
     result += *i; 

    return midterm*0.4 + final*0.4 + (result/homework.size())*0.2; 
} 


double Core::grade() const 
{ 
    return calc_grade(midterm, final, homework); 
} 

std::istream& Core::read_common(std::istream& in) 
{ 
    in >> n >> midterm >> final; 
    return in; 
} 

std::istream& Core::read(std::istream& in) 
{ 
    read_common(in); 
    read_hw(in, homework); 
    return in; 
} 

std::istream& Core::read_hw(std::istream& in, std::vector<double>& homework) 
{ 
    double input; 
    while (in >> input) 
     homework.push_back(input); 

    return in; 
} 

////////////////////////////////////////////////////////// 
//////////////////////////GRAD CLASS////////////////////// 
////////////////////////////////////////////////////////// 
class Grad : public Core { 
public: 
    Grad() : thesis(0) { } 
    Grad(std::istream& is) { read(is); } 

    double grade() const; 
    std::istream& read(std::istream&); 
private: 
    double thesis; 
}; 

std::istream& Grad::read(std::istream& in) 
{ 
    read_common(in); 
    in >> thesis; 
    read_hw(in, homework); 
    return in; 
} 

double Grad::grade() const 
{ 
    return std::min(Core::grade(), thesis); 
} 

////////////////////////////////////////////////////////// 
//////////////////////MISCELLANEOUS/////////////////////// 
////////////////////////////////////////////////////////// 
bool compare_grades(const Core& c1, const Core& c2) 
{ 
    return c1.grade() < c2.grade(); 
} 

bool compare_Core_ptrs(const Core* cp1, const Core* cp2) 
{ 
    return compare_grades(*cp1, *cp2); 
} 

using namespace std; 

int main() 
{ 
    vector<Core*> students; 
    Core* record; 
    char ch; 
    string::size_type maxlen = 0; 

    while (cin >> ch) 
    { 
     if (ch == 'U') 
      record = new Core; 
     else 
      record = new Grad; 
     record->read(cin); 
     maxlen = max(maxlen, record->name().size()); 
     students.push_back(record); 
    } 

    sort(students.begin(), students.end(), compare_Core_ptrs); 

    for (vector<Core*>::size_type i = 0; i != students.size(); ++i) 
    { 
     cout << students[i]->name() << string(maxlen + 1 - students[i]->name().size(), ' '); 
     try 
     { 
      double final_grade = students[i]->grade(); 
      streamsize prec = cout.precision(); 
      cout << setprecision(3) << final_grade << setprecision(prec) << endl; 
     } 
     catch (domain_error e) 
     { 
      cout << e.what() << endl; 
     } 
     delete students[i]; 
    } 
    return 0; 
} 
+0

большое спасибо. – trollpidor

Смежные вопросы