conman
conman

Reputation: 109

C++ Class 'undeclared identifier"

This is really frustrating, I've tried multiple variations of my class and constructor, sifted through pages of google results and other questions on this site but I can't figure it out. I believe the error is something simple that I'm overlooking.

Error code:

1>main.cpp(60): error C2065: 'Student' : undeclared identifier
1>main.cpp(60): error C2146: syntax error : missing ';' before identifier 'newStudent'
1>main.cpp(60): error C3861: 'newStudent': identifier not found

student.h

#ifndef STUDENT_H
#define STUDENT_H
class Student {  
    private:
    static const int SIZE = 7;         // initial size of the array
    int *Students;                     // Students will point to the dynamically allocated array
    //int numStudents;                   // number of students currently in the list
    int rosterSize;                    // the current size of the roster
    int student_id;
    string name;
    string classification;
    public:
    Student();                         // constructor; initialize the list to be empty
    ~Student();
        void set_id(int);
        void set_name(string);
        void set_class(string);
            int print_id();
            string print_name();
            string print_class();
    //void enrollStudent();              
    //void Print(ostream &output) const; // print the list to output
};
#endif

student.cpp

        #include <iostream>
#include <string>

#include "student.h"

#define PROMPT "class> "
using namespace std;

Student::Student(){    // declared here right?
    student_id = 0;
    name = "";
    classification = "";
}

Student::~Student(){
    //delete Student
}

void Student::set_id( int i ){
    student_id = i;
}

void Student::set_name( string n ){
    name = n;
}

void Student::set_class( string c ){
    classification = c;
}

int Student::print_id(){
    return student_id;
}

string Student::print_name(){
    return name;
}

string Student::print_class(){
    return classification;
}

main.cpp

#include <iostream>
#include <string>
#include "student.h"

#define PROMPT "class> "
using namespace std;


//**** Implement Error Handling ****\\

enum errorType {
    UNKNOWN_ERROR,
    INPUT_ERROR,
    HANDLER,
    NUM_ERRORS
};

// error messages

string errorMessage[NUM_ERRORS]= {
    "Unknown Error\n",
    "Input Error\n",
};

// error handler

void handleError(errorType err) {
    if(err > 0 && err < NUM_ERRORS)
        cout<< "Error: "<< errorMessage[err];
    else cout<< "Error: "<< errorMessage[UNKNOWN_ERROR];
}

//**** END Error Handling ****\\



void getInput() {


    int id; string n, c;
    cin>>id>>n>>c; 
    //cout<<id<<"-"<<n<<"-"<<c<<endl;
    Student newStudent();      //****WORK DAMN U!
    //set_id(id);
    //print_id();

    return;
}


int main() {
    //Student newStudent();   /* <-- why doesn't this work?!*/
    string input = "";
    bool finished = false;

    cout<<PROMPT; // prompt the user
    while(!finished) {
        if(input!="") cout<<PROMPT;
        cin>>input;
        if(input=="enroll") {
            cout<<PROMPT<<"Enroll student:"<<endl;
            getInput();
        }
        else if(input=="drop") {
            cout<<PROMPT<<"Enter ID:"<<endl;
        }
        else if(input=="roster") {
            cout<<"This will print formatted list of students"<<endl;
        }
        else if(input=="quit") {
            finished=true;
        }
        else handleError(errorType(1));
    }
}

Just as a note, my professor said adding #include student.h
to my main.cpp would fix my issue. OBVIOUSLY NOT because I included it in my student.cpp SO THANKS. ಠ_ಠ

tl;dr here is a smaller barebones version that gets same errors:

#include<iostream>
#include<string>
#define PROMPT "class> "

using namespace std;

class Student {
private:
int student_id;
string name;
string classification;
public:
Student();    // constructor
~Student();
void set_id(int);
int print_id();
};

Student::Student(){
    student_id = 0;
    name = "";
    classification = "";
}

Student::~Student(){
//delete Student
}

void Student::set_id( int i ){
    student_id = i;
}


int Student::print_id(){
    return student_id;
}


void messenger(){
int id;

   Student newStudent();

   cin>>id;      //this will drop the name and class
   newStudent.set_id(id);
   newStudent.print_id();
return;
}

void main() {
//Student newStudent();
string input="";
bool finished=false;

cout<<PROMPT; // prompt the user
        while(!finished) {
                if(input!="") cout<<PROMPT;
                cin>>input;
                if(input=="enroll") {
                        cout<<PROMPT<<"Enroll student:"<<endl;
                        messenger();
                        //cin>>input;
                        //newStudent.enroll(input );
                }
                else if(input=="drop") {
                        cout<<PROMPT<<"Enter ID:"<<endl;
                }
                else if(input=="roster") {
                        cout<<"This will print formatted list of students"<<endl;
                }
                else if(input=="quit") {
                        finished=true;
                }
        }
}

Upvotes: 1

Views: 39727

Answers (2)

duselbaer
duselbaer

Reputation: 935

Have you tried to initialize the Student object without the parentheses?

Student newStudent;

This calls the default constructor. What you did with

Student newStudent();

is to declare a function which takes no parameters and returns a Student object.

Upvotes: 5

Alok Save
Alok Save

Reputation: 206508

Just as a note, my professor said adding #include student.h
to my main.cpp would fix my issue. OBVIOUSLY NOT because I included it in my student.cpp

Your main() needs to know what is the the type Student to be able to create its object.
So your professor is correct.

Each source file is compiled separately, So when the compiler compiles main.cpp it needs to see the definition of the type Student.It can only do so if you include the header student. which defines the type in main.cpp. Note that including the header in student.cpp has no bearing on the fact that the definition needs to be seen in main.cpp because both of them are compiled as separate files.

Upvotes: 4

Related Questions