视觉"1 unresolved externals" C++

visual "1 unresolved externals" C++

本文关键字:C++ externals 视觉 unresolved      更新时间:2023-10-16

我已经检查了所有文件之间的连接,以及类和函数定义,但每次我尝试运行程序时,它都会阻止我,并告诉我它有"1个未解析的外部"。

该程序应该打开多个文件("学生"文件和"成绩"文件),从中读取,然后使用"查询文件"查看数据,在查询文件中找到要求的学生,并将其打印到新文件中。令人困惑对

尽管如此,我还是很接近一个解决方案,但因为我使用的是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 _WinMain@16 referenced in function ___tmainCRTStartup
1>C:UsersStudentDocumentsVisual Studio 2010ProjectsCS235 Project 1DebugCS235 Project 1.exe : fatal error LNK1120: 1 unresolved externals

您正试图将具有标准入口点(int main())的程序编译为windows GUI应用程序,而windows GUI应用程序需要

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

相反。

不过,将您的入口点更改为这样对您没有帮助,因为您正试图编译(在Visual Studio世界中称之为)"控制台程序"。当您设置项目时,会有一个创建控制台项目的选项。您可以废弃现有的控制台项目,创建一个新的控制台项目将代码粘贴到其中,以便轻松修复。如果你真的执着于你当前的项目,你可以修复它

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

这是一个链接器错误。您正在调用一个函数,当需要将程序链接在一起时,链接器找不到要链接的函数。

您可能缺少库或源文件。