2012-01-20 95 views
3

我检查了所有文件之间的连接,以及类和函数定义,但每次我尝试运行我的程序时,它都会阻止我,并告诉我它有1个未解决的问题外部对象”。“1 unresolved externals”C++

该程序应该打开多个文件(一个“学生”文件和一个“成绩”文件),从它们读取,然后使用“查询文件”来查看数据,找到学生问在查询文件中,并将其打印到新文件中。混乱?是。

尽管如此,我非常接近解决方案,但因为我使用的是Visual Studio,它甚至不会让我运行该程序,直到找到并终止“1个未解析的外部”。它甚至不会告诉我错误在哪里。我对C++相当陌生,无论我多么努力搜索,似乎都无法解决这个问题。

这是我的主要程序:

#include <iostream> 
#include <sstream> 
#include <string> 
#include <vector> 
#include <fstream> 

#include "Student.h" 

using namespace std; 

int main(){ 



    //Request a file to read from, and open it (I haven't declared the files yet, don't worry about that) 
    ifstream input_file; 
    string studentfile = ""; 
    string gradefile = ""; 
    string queryfile = ""; 


    //Create a Map for the Students 
    map<string, Student *> student_map; 

    //Open the Student file and load it in 
    cout << "Loading \"" << studentfile << "\"... " <<endl; 
    input_file.open(studentfile); 

    //Look for: 
    string id_number; 
    string name; 
    string address; 
    string phone; 

    //Boolean value to check for duplicate students 
    bool duplicate = false; 

    //Check to see if the Student File is empty 
    if (!input_file.eof()){ 

     while (input_file.good()){ 
      //Get the ID Number 
      input_file.get(); 
      getline (input_file, id_number); 

      //Sort through and make sure there are no duplicate students 
      for (map<string, Student *>::iterator counter = student_map.begin(); counter != student_map.end(); counter ++){ 
       if (counter->first == id_number){ 
        duplicate = true; 
        counter = student_map.end(); 
       } 
      } 

      if (duplicate != true){ 
       //Get the name 
       input_file.get(); 
       getline (input_file, name); 

       //Get the Address 
       input_file.get(); 
       getline (input_file, address); 

       //Get the Phone Number 
       input_file.get(); 
       getline (input_file, phone); 

       //Create a new student               
       Student * newStudent = new Student (id_number, name, address, phone); 

       //Add it to the map (referenced by the ID number) 
       student_map[id_number] = newStudent; 
      } 
     } 
    } 

    else { 
     return 0; 
    } 
    input_file.close(); 

    //Open the Grades file and load it in 
    cout << "Loading \"" << gradefile << "\"... " <<endl; 
    input_file.open(gradefile); 

    //Look for (id_number already defined): 
    string course; 
    string grade; 

    if (!input_file.eof()){ 

     while (input_file >> course >> id_number >> grade){ 
      //Find the student referenced 
      Student* current_student = student_map[id_number]; 
      //Calculate their grade points and add them to their grade point vector 
      current_student ->add_grade_points(current_student ->check_grade_points(grade)); 
     } 
    } 

    else { 
     return 0; 
    } 
    input_file.close(); 

    //Open the Query file and load it in 
    cout << "Loading \"" << queryfile << "\"... " << endl; 
    input_file.open(queryfile); 

    if (!input_file.eof()){ 

     //Write to 
     ofstream output_file ("report.txt"); 

     //No need to "Look for" anything, id_number alread defined 

     //If the file is open, write to it 
     if (output_file.is_open()) 
     { 
      while (input_file >> id_number) 
      { 
       //Print the ID Number (With four spaces) 
       output_file << id_number << " "; 

       //Print out the GPA (With four spaces) 
       Student* current_student = student_map[id_number]; 
       output_file << current_student->get_gpa() << " "; 

       //Print out the student's name (Then end that line) 
       output_file << current_student->get_name() << endl; 
      } 
     } 
     input_file.close(); 
     output_file.close(); 
    } 

    else { 
     return 0; 
    } 


    cout << endl; 
    cout << "File Printed."; 

    return 0; 
} 

这里是我的 “学生” 类(头文件):

#pragma once 
#include <iostream> 
#include <sstream> 
#include <string> 
#include <vector> 
#include <fstream> 
#include <map> 

using namespace std; 

class Student 
{ 
public: 
    Student (string _id_number, string _name, string _address, string _phone); 

    void add_grade_points (double grade_points); 
    double check_grade_points (string grade); 

    double get_gpa() const; 
    string get_name() const; 

private: 
    string id_number; 
    string name; 
    string address; 
    string phone; 

    vector <double> grade_points; 
}; 

最后,我的类函数:

#include "Student.h" 

Student::Student (string _id_number, string _name, string _address, string _phone){ 
    id_number = _id_number; 
    name = _name; 
    address = _address; 
    phone = _phone; 
} 

void Student::add_grade_points (double new_grade_point){ 
    grade_points.push_back(new_grade_point); 
} 

double Student::check_grade_points (string grade) { 
    if (grade == "A") 
     return 4.0; 
    else if (grade == "A-") 
     return 3.7; 
    else if (grade == "B+") 
     return 3.4; 
    else if (grade == "B") 
     return 3.0; 
    else if (grade == "B-") 
     return 2.7; 
    else if (grade == "C+") 
     return 2.4; 
    else if (grade == "C") 
     return 2.0; 
    else if (grade == "C-") 
     return 1.7; 
    else if (grade == "D+") 
     return 1.4; 
    else if (grade == "D") 
     return 1.0; 
    else if (grade == "D-") 
     return 0.7; 
    else 
     return 0.0; 
} 

double Student::get_gpa() const{ 
    //Add up all of the grade points 
    double total = 0; 

    for (int i = 0; i < grade_points.size(); i++) { 
     total = total + grade_points[i]; 
    } 

    //Calculate the Grade Point Average 
    double gpa = total/grade_points.size(); 

    return gpa; 
} 

string Student::get_name() const{ 
    return name; 
} 

任何帮助会非常棒!

编辑:下面是出现错误信息:这是一个链接错误

1>MSVCRTD.lib(crtexew.obj) : error LNK2019: unresolved external symbol [email protected] referenced in function ___tmainCRTStartup 
1>C:\Users\Student\Documents\Visual Studio 2010\Projects\CS235 Project 1\Debug\CS235 Project 1.exe : fatal error LNK1120: 1 unresolved externals 
+6

哪个功能没有解决?换句话说,**你得到了什么确切的错误信息? –

+2

我想你正试图编译控制台应用程序作为Windows GUI应用程序。 Linker预计'WinMain',而不是'main'。检查你的项目设置。 – lapk

回答

7

您试图编译程序与标准的入口点(INT主())作为Windows GUI应用程序和Windows GUI应用程序需要

int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR lpCmd, int nShow) 

相反。

虽然,当您试图编译(在Visual Studio世界中称为“控制台程序”)时,更改入口点并不会对您有所帮助。在设置项目时,可以选择创建控制台项目。您可以取消您已有的并创建一个新的控制台项目,以便将代码粘贴到一个简单的修复程序中。如果你真的关注了你当前的项目,你可以修复它。

在项目设置中: 在配置属性> C/C++>预处理器中,更改_WINDOWS;字符串中的预处理器定义为_CONSOLE; ,并在配置属性>链接器>系统下,将子系统更改为控制台。

2

。您正在调用一个函数,当它将时间链接到一起时,链接程序找不到要链接的函数。

您可能缺少图书馆或源文件。