简体   繁体   中英

“1 unresolved externals” C++

I've checked the connections between all of my files, as well as Class and Function definitions, but every time I try to run my program it stops me and tells me that it has "1 unresolved externals".

The program is supposed to open up multiple files (A "student" file, and a "grades" file), read from them, and then use a "query file" to look through the data, find the students asked for in the query file, and print it to a new file. Confusing? Yes.

Still, I'm pretty close to a solution, but because I'm using Visual Studio it won't even let me run the program until I find and put an end to the "1 unresolved externals". It won't even tell me where the error is. I'm fairly new to C++, and no matter how hard I search, I can't seem to remedy the issue.

Here's my Main Program:

#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;
}

Here's my "Student" Class (Header File):

#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;
};

And finally, my class functions:

#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;
}

Any help would be so amazing!

EDIT: Here's the error message that comes up:

1>MSVCRTD.lib(crtexew.obj) : error LNK2019: unresolved external symbol _WinMain@16 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

You are trying to compile a program with the standard entry point (int main()) as a windows GUI application, and Windows GUI applications require

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

Instead.

Changing your entry point to this won't help you though, as you're trying to compile (what's called in the Visual Studio world) a 'console program'. When you set up the project, there would have been an option to create a console project. You can scrap the one you've got and create a new console project to paste your code into for an easy fix. If you're really attached to your current project though, you can fix it.

In the project settings: Under Configuration Properties > C/C++ > Preprocessor, change the _WINDOWS; string in the Preprocessor definitions to _CONSOLE; and under Configuration Properties > Linker > System, change the SubSystem to Console.

That's a linker error. You are calling a function and when it come's time to link the program together, the linker can't find the function to link.

You are probably missing a library or source file.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM