0

Using C++ and Xcode I always run into this problem where linker command fails. I don't know what this means. I'm creating an elementary program that consists of 3 files. A main.cpp, and a class file that has a header. The main file is empty. This what the other two look like:

student.hpp :

#include <stdio.h>
#include <iostream>
#include <fstream>
#include <string>
#include <cmath>
#include <sstream>

std::string line;
class Student{
public:
    std::string fullName;
    int projectGrade;
    int quizGrade;
    int midtermGrade;
    int finalGrade;
    int finish;
    int start = 14;

    std::string getStudentName();
    int getProjectGrade();
    int getQuizGrade();
    int getMidtermGrade();
    int getFinalGrade();
    double getOverallGrade();
    bool login(std::string username, std::string password);
    bool login(std::string username);
};

student.cpp:

#include "student.hpp"

std::string Student::getStudentName(){
    finish = line.find("\t", start);
    fullName = line.substr(start, finish);
    return fullName;
}
int Student::getProjectGrade(){
    start = line.find("\t", start) + finish;
    finish = start + 2;
    std::stringstream stream(line.substr(start, 2));
    stream >> projectGrade;
    return projectGrade;
}
int Student::getQuizGrade(){
    start+=3;
    std::stringstream stream(line.substr(start, 2));
    stream >> quizGrade;
    return quizGrade;
}
int Student::getMidtermGrade(){
    start+=3;
    std::stringstream stream(line.substr(start, 2));
    stream >> midtermGrade;
    return midtermGrade;
}
int Student::getFinalGrade(){
    start+=3;
    std::stringstream stream(line.substr(start, 2));
    stream >> finalGrade;
    return finalGrade;
}
double Student::getOverallGrade(){
    return round((projectGrade + quizGrade + midtermGrade + finalGrade)/40)*10;
}
bool Student::login(std::string username, std::string password){
    std::ifstream studentFile;
    studentFile.open("/Users/griffin/desktop/Data Structures/Data Structures1/Data Structures1/Students.txt");
    if(studentFile.is_open()){
        while(getline (studentFile,line))
        {
            if ((username.length() == 7 && username.substr(0,4).compare("u000") == 0 && line.find(username) != std::string::npos) && (password.length() == 6 && password.substr(0,2).compare("pw") == 0 && line.find(password) != std::string::npos))
                return true;
        }
    }
    return false;
}
bool Student::login(std::string username){

    std::ifstream studentFile;
    studentFile.open("/Users/griffin/desktop/Data Structures/Data Structures1/Data Structures1/Students.txt");
    if(studentFile.is_open()){
        while(getline (studentFile,line))
        {
            if (username.length() == 7 && username.substr(0,4).compare("u000") == 0 && line.find(username) != std::string::npos)
                return true;
        }
    }
    return false;
}

The main file includes student.hpp. Is this a problem on Xcode's end or do I have an error in my code?

Main.cpp

#include "student.hpp"    
int main(int argc, const char * argv[]) {
    return 0;
}
M Reza
  • 18,350
  • 14
  • 66
  • 71
Griffin
  • 155
  • 2
  • 11

1 Answers1

1

Your problem is that you've multiply declared the global variable line.

There is no good reason for a global variable in your code so the simple solution is to declare line inside the two login methods instead.

For future reference however, here's how you should declare global variables

How do I use extern to share variables between source files?

john
  • 85,011
  • 4
  • 57
  • 81
  • std::string line; is only declared once in student.hpp, even though I use the line variable in student.cpp as well – Griffin Jan 22 '19 at 22:34
  • @Griffen, but student.hpp is included **twice**, in student.cpp and main.cpp, so `line` gets declared twice resulting in a linker error. See my link for how to do global variables properly. – john Jan 22 '19 at 22:35