«1 неразрешенная внешность» C ++ - PullRequest
3 голосов
/ 20 января 2012

Я проверил соединения между всеми моими файлами, а также определениями классов и функций, но каждый раз, когда я пытаюсь запустить мою программу, она останавливает меня и сообщает, что у нее "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:\Users\Student\Documents\Visual Studio 2010\Projects\CS235 Project 1\Debug\CS235 Project 1.exe : fatal error LNK1120: 1 unresolved externals

Ответы [ 2 ]

7 голосов
/ 20 января 2012

Вы пытаетесь скомпилировать программу со стандартной точкой входа (int main ()) в качестве приложения Windows GUI, а приложения Windows GUI требуют

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

Вместо.

Изменение вашей точки входа в это не поможет вам, поскольку вы пытаетесь скомпилировать (что называется в мире Visual Studio) «консольную программу». При настройке проекта была бы возможность создать консольный проект. Вы можете отказаться от того, что у вас есть, и создать новый консольный проект, чтобы вставить в него код для легкого исправления. Если вы действительно привязаны к своему текущему проекту, вы можете это исправить.

В настройках проекта: Под Свойства конфигурации> C / C ++> Препроцессор измените _WINDOWS; строка в определениях препроцессора _CONSOLE; и в Свойствах конфигурации> Линкер> Система измените Подсистему на Консоль.

2 голосов
/ 20 января 2012

Это ошибка компоновщика.Вы вызываете функцию, и когда приходит время связать программу, компоновщик не может найти функцию для ссылки.

Возможно, вам не хватает библиотеки или исходного файла.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...