The problem I am having is that it will not allow me to define a class without building a default constructor outside of the class. For instance if you comment out line 19 on the header file you will recieve an external linker error. The same will happen if you comment out the external constructor of any of the classes. It took me 4 days to figure out that I had to do that to even get rid of that linker error. The second problem is that I cannot get the addressBookType to inherit arrayListType. But it is because of the first problem. I cannot write a constructor outside of the class after I inherit because I get the error that I arrayListType has multiple default constructors. And I cannot comment out line 512 because I get the external linker error.

#ifndef ADDRESSTYPE_H
#define ADDRESSTYPE_H
#include <iostream>
#include <string>
#include <assert.h>

using namespace std;



class personType
{
public:
    personType();
    void print();
    string firstname;
    string lastname;
};
personType::personType(){}

class addressType
{
    public:
        addressType();
        void printaddress ();
        string street;
        string city;
        string state;
        string zip;
        string getaddress(){
        string address = street.append(" ").append(city).append(" ").append(state).append(" ").append(zip);
            return address;}
};
addressType::addressType(){}

class dateType
{
public:
    dateType();
    int month;
    int day;
    int year;

};
dateType::dateType(){}

class extPersonType:public personType, public addressType,public dateType
{
public:
    extPersonType();
     string getrelationship(){ return relationship;};
     void setrelationship(string val) {relationship=val;};
     string getphone(){return phone;};
     void setphone(string val){phone=val;};
     void printperson(){
         cout<<firstname<<" "<<lastname<<" "<<street<<" "<<city<<" "<<state<<" "<<zip<<" "<<relationship<<" "<<phone<<" "<<day<<"-"<<month<<"-"<<year<<"\n";
          };

private:
    string relationship;
    string phone;

};
extPersonType::extPersonType(){}


template <class elemType>
class arrayListType
{
public:
    arrayListType();
    const arrayListType<elemType>& operator= (const arrayListType<elemType>&);
      //Overloads the assignment operator
    bool isEmpty() const;
      //Function to determine whether the list is empty
      //Postcondition: Returns true if the list is empty;
      //    otherwise, returns false.
    bool isFull() const;
      //Function to determine whether the list is full.
      //Postcondition: Returns true if the list is full;
      //    otherwise, returns false.
    int listSize() const;
      //Function to determine the number of elements in the list
      //Postcondition: Returns the value of length.
    int maxListSize() const;
      //Function to determine the size of the list.
      //Postcondition: Returns the value of maxSize.
    void print() const;
      //Function to output the elements of the list
      //Postcondition: Elements of the list are output on the
       //   standard output device.
    bool isItemAtEqual(int location, const elemType& item) const;
      //Function to determine whether the item is the same
      //as the item in the list at the position specified by
      //Postcondition: Returns true if the list[location]
      //    is the same as the item; otherwise,
      //               returns false.
   void insertAt(int location, const elemType& insertItem);
      //Function to insert an item in the list at the
      //position specified by location. The item to be inserted
      //is passed as a parameter to the function.
      //Postcondition: Starting at location, the elements of the
      //    list are shifted down, list[location] = insertItem;,
      //    and length++;. If the list is full or location is
      //    out of range, an appropriate message is displayed.
   void insertEnd(const elemType& insertItem);
      //Function to insert an item at the end of the list.
      //The parameter insertItem specifies the item to be inserted.
      //Postcondition: list[length] = insertItem; and length++;
      //    If the list is full, an appropriate message is
      //    displayed.
    void removeAt(int location);
      //Function to remove the item from the list at the
      //position specified by location
      //Postcondition: The list element at list[location] is removed
      //    and length is decremented by 1. If location is out of
      //    range,an appropriate message is displayed.
    void retrieveAt(int location, elemType& retItem) const;
      //Function to retrieve the element from the list at the
      //position specified by location.
      //Postcondition: retItem = list[location]
      //    If location is out of range, an appropriate message is
      //    displayed.
    void replaceAt(int location, const elemType& repItem);
      //Function to replace the elements in the list at the
      //position specified by location. The item to be replaced
      //is specified by the parameter repItem.
      //Postcondition: list[location] = repItem
      //    If location is out of range, an appropriate message is
      //    displayed.
    void clearList();
      //Function to remove all the elements from the list.
      //After this operation, the size of the list is zero.
      //Postcondition: length = 0;
    int seqSearch(const elemType& item) const;
      //Function to search the list for a given item.
      //Postcondition: If the item is found, returns the location
      //    in the array where the item is found; otherwise,
      //    returns -1.
    void insert(const elemType& insertItem);
      //Function to insert the item specified by the parameter
      //insertItem at the end of the list. However, first the
      //list is searched to see whether the item to be inserted
      //is already in the list.
      //Postcondition: list[length] = insertItem and length++
      //     If the item is already in the list or the list
      //     is full, an appropriate message is displayed.
    void remove(const elemType& removeItem);
      //Function to remove an item from the list. The parameter
      //removeItem specifies the item to be removed.
      //Postcondition: If removeItem is found in the list,
      //      it is removed from the list and length is
      //      decremented by one.

    arrayListType(int size = 500);
      //constructor
      //Creates an array of the size specified by the
      //parameter size. The default array size is 100.
      //Postcondition: The list points to the array, length = 0,
      //    and maxSize = size

    arrayListType(const arrayListType<elemType>& otherList);
      //copy constructor

    ~arrayListType();
      //destructor
      //Deallocates the memory occupied by the array.

protected:
    elemType *list;  //array to hold the list elements
    int length;      //to store the length of the list
    int maxSize;     //to store the maximum size of the list
};

template <class elemType>
bool arrayListType<elemType>::isEmpty() const
{
    return (length == 0);
}

template <class elemType>
bool arrayListType<elemType>::isFull() const
{
    return (length == maxSize);
}

template <class elemType>
int arrayListType<elemType>::listSize() const
{
    return length;
}

template <class elemType>
int arrayListType<elemType>::maxListSize() const
{
    return maxSize;
}

template <class elemType>
void arrayListType<elemType>::print() const
{
    for (int i = 0; i < length; i++)
        cout << list[i] << " ";

    cout << endl;
}

template <class elemType>
bool arrayListType<elemType>::isItemAtEqual
                            (int location, const elemType& item) const
{
    return (list[location] == item);
}

template <class elemType>
void arrayListType<elemType>::insertAt
                  (int location, const elemType& insertItem)
{
    if (location < 0 || location >= maxSize)
        cerr << "The position of the item to be inserted "
             << "is out of range" << endl;
    else
        if (length >= maxSize)  //list is full
            cerr << "Cannot insert in a full list" << endl;
        else
        {
            for (int i = length; i > location; i--)
                 list[i] = list[i - 1];   //move the elements down

            list[location] = insertItem;  //insert the item at the
                                          //specified position

            length++;     //increment the length
    }
} //end insertAt

template <class elemType>
void arrayListType<elemType>::insertEnd(const elemType& insertItem)
{

    if (length >= maxSize)  //the list is full
        cerr << "Cannot insert in a full list" << endl;
    else
    {
         list[length] = insertItem;   //insert the item at the end
         length++;   //increment the length
    }
} //end insertEnd

template <class elemType>
void arrayListType<elemType>::removeAt(int location)
{
    if (location < 0 || location >= length)
        cerr << "The location of the item to be removed "
             << "is out of range" << endl;
    else
    {
        for (int i = location; i < length - 1; i++)
            list[i] = list[i+1];

        length--;
    }
} //end removeAt

template <class elemType>
void arrayListType<elemType>::retrieveAt
                             (int location, elemType& retItem) const
{
    if (location < 0 || location >= length)
        cerr << "The location of the item to be retrieved is "
             << "out of range." << endl;
    else
        retItem = list[location];
} //end retrieveAt


template <class elemType>
void arrayListType<elemType>::replaceAt
                          (int location, const elemType& repItem)
{
    if (location < 0 || location >= length)
        cerr << "The location of the item to be replaced is "
             << "out of range." << endl;
    else
        list[location] = repItem;

} //end replaceAt

template <class elemType>
void arrayListType<elemType>::clearList()
{
    length = 0;
} //end clearList

template <class elemType>
int arrayListType<elemType>::seqSearch(const elemType& item) const
{
    int loc;
    bool found = false;

    for (loc = 0; loc < length; loc++)
        if (list[loc] == item)
        {
            found = true;
            break;
        }

    if (found)
        return loc;
    else
        return -1;
} //end seqSearch

template <class elemType>
void arrayListType<elemType>::insert(const elemType& insertItem)
{
    int loc;

    if (length == 0)   //list is empty
        list[length++] = insertItem;    //insert the item and
                                //increment the length
    else if (length == maxSize)
        cerr << "Cannot insert in a full list." << endl;
    else
    {
        loc = seqSearch(insertItem);

        if (loc == -1)    //the item to be inserted
                          //does not exist in the list
            list[length++] = insertItem;
        else
            cerr << "the item to be inserted is already in "
                 << "the list. No duplicates are allowed." << endl;
    }
} //end insert

template<class elemType>
void arrayListType<elemType>::remove(const elemType& removeItem)
{
    int loc;

    if (length == 0)
        cerr << "Cannot delete from an empty list." << endl;
    else
    {
        loc = seqSearch(removeItem);

        if (loc != -1)
            removeAt(loc);
        else
            cout << "The item to be deleted is not in the list."
                 << endl;
    }
} //end remove

template <class elemType>
arrayListType<elemType>::arrayListType(int size)
{
    if (size < 0)
    {
        cerr << "The array size must be positive. Creating "
             << "an array of size 100. " << endl;

        maxSize = 500;
    }
    else
        maxSize = size;

    length = 0;

    list = new elemType[maxSize];
    assert(list != NULL);
}

template <class elemType>
arrayListType<elemType>::~arrayListType()
{
    delete [] list;
}


template <class elemType>
arrayListType<elemType>::arrayListType
                   (const arrayListType<elemType>& otherList)
{
    maxSize = otherList.maxSize;
    length = otherList.length;
    list = new elemType[maxSize]; //create the array
    assert(list != NULL);         //terminate if unable to allocate
                                  //memory space

    for (int j = 0; j < length; j++)  //copy otherList
        list [j] = otherList.list[j];
} //end copy constructor

template <class elemType>
const arrayListType<elemType>& arrayListType<elemType>::operator=
                      (const arrayListType<elemType>& otherList)
{
    if (this != &otherList)   //avoid self-assignment
    {
        delete [] list;
        maxSize = otherList.maxSize;
        length = otherList.length;

        list = new elemType[maxSize];  //create the array
        assert(list != NULL);   //if unable to allocate memory
                                //space, terminate the program
        for (int i = 0; i < length; i++)
            list[i] = otherList.list[i];
    }

    return *this;
}

class addressBookType//:public arrayListType<extPersnType>
{
public:
    addressBookType();

    extPersonType list[500];
    int length;


    void findlastname(string input){
    cout<<"Records matching the input last name are:\n";
    int count=0;
    for(int i=0;i<length;i++){

     if (list[i].lastname==input){
       cout<<i<<" "<<list[i].lastname<<"\n";
       count++;
       }
       }
    if (count==0){cout<<"No records found.\n";}
    }

    void findperson(string first, string last){
    cout<<"Records matching the input name are:\n";
    int count=0;
    for(int i=0;i<length;i++){
     if (list[i].lastname==last && list[i].firstname==first){
     cout<<i<<" "<<list[i].getaddress()<<" "<<list[i].getphone()<<" "<<list[i].day<<"-"<<list[i].month<<"-"<<list[i].year<<"\n";
     count++;
     }
     }
     if (count==0){cout<<"No records found.\n";}
     }

     void findnames(char first[], char second[]){
     cout<<"Records between the input last names are:\n";
     int count=0;
     for(int i=0;i<length;i++){
     int tempfn=list[i].firstname.size();
     int templn=list[i].lastname.size();
     char *ln=(char*)list[i].lastname.c_str();
     char *fn=(char*)list[i].firstname.c_str();
     if (strcmp(fn,first)>=0 && strcmp(ln,second)<=0){
     cout<<i<<" "<<list[i].lastname<<"\n";
     count++;
     }
     }
     if (count==0){cout<<"No records found.\n";}

     }

     void findstatus(string status){
         cout<<"Records matching the input status are:\n";
         int count=0;
         for(int i=0;i<length;i++){
            if(list[i].getrelationship()==status){
                cout<<i<<" "<<list[i].firstname<<" "<<list[i].lastname<<" "<<list[i].getrelationship()<<"\n";
                count++;
            }
         }
         if(count==0){cout<<"No records found.\n";}
     }
     void findbirthmonth(int m){
         cout<<"Records with birthdays in the month "<<m<<":\n";
         int count=0;
             for(int i=0;i<length;i++){
                 if(list[i].month==m){
                     cout<<i<<" "<<list[i].firstname<<" "<<list[i].lastname<<" "<<list[i].day<<"-"<<list[i].month<<"-"<<list[i].year<<"\n";
                     count++;
                 }
             }
             if(count==0){cout<<"No records found.\n";}
     }
     void findbirth(int d1, int m1, int y1, int d2, int m2, int y2){
         cout<<"Records with dates between the 2 input dates.\n";
         int count=0;
             for(int i=0;i<length;i++){
                 if((list[i].year>=y1) &&
                    (list[i].year<=y2)){
                        if((list[i].year==y1)||(list[i].year==y2) && (list[i].month>=m1)&&(list[i].month<=m2)){
                        if((list[i].month==m1)&&(list[i].month==m2) && (list[i].day>=d1)||(list[i].day<=d2)){
                        cout<<i<<" "<<list[i].firstname<<" "<<list[i].lastname<<" "<<list[i].day<<"-"<<list[i].month<<"-"<<list[i].year<<"\n";
                        count++;
                        }
                        else if((list[i].month>m1)&&(list[i].month<m2)){cout<<i<<" "<<list[i].firstname<<" "<<list[i].lastname<<" "<<list[i].day<<"-"<<list[i].month<<"-"<<list[i].year<<"\n";
                        count++;}
                 }
                    else if((list[i].year>y1)||(list[i].year<y2)){cout<<i<<" "<<list[i].firstname<<" "<<list[i].lastname<<" "<<list[i].day<<"-"<<list[i].month<<"-"<<list[i].year<<"\n";
                        count++;}

             }
                 }

             if(count==0){cout<<"No records found.\n";}
}
};
addressBookType::addressBookType(){}
#endif//  ADDRESSTYPE_H

Here is the other part of the program:

#include "Chapter3ex9.h"
#include <conio.h>
#include <iostream>
#include <fstream>
#include <string>
#include <stdio.h>
#include <sstream>
#include <list>
#include <cstring>

using namespace std;

int main()
{
    int d;
    int m;
    int y;
    string str;
    string tokens[11];
    ifstream myfile("C:\\Users\\nunyab32\\Documents\\Visual Studio 2010\\Projects\\addressbook\\addressbook\\test.txt");
    int a=0;
    int b=0;
    extPersonType person;
    addressBookType arrayObj;

    if(!myfile)
    {
        cout<<"File not found"<<endl;
        system("pause");
        return -1;
    }
    while(!myfile.eof()&&(b<=500))
    {
      getline(myfile, str);

      stringstream iss(str);
      while(iss.good())
      {string str;
      getline(iss,str,',');
      tokens[a] = str;
      a++;

      }
        d=0,m=0,y=0;
        person.firstname=tokens[0];
        person.lastname=tokens[1];
        person.street= tokens[2];
        person.city=tokens[3];
        person.state=tokens[4];
        person.zip=tokens[5];
        person.setrelationship(tokens[6]);
        person.setphone(tokens[7]);
        stringstream buffer1(tokens[8]);
        buffer1>>d;
        stringstream buffer2(tokens[9]);
        buffer2>>m;
        stringstream buffer3(tokens[10]);
        buffer3>>y;
        if(d!=0){
        person.day=d;
        person.month=m;
        person.year=y;
        }
        else{person.day=0;
        person.month=0;
        person.year=0;}

        arrayObj.list[b]=person;
        b++;
        a=0;
        arrayObj.length=b;



    }
    int choice=0,d1,d2,m1,m2,y1,y2;
    string first, last, status;
    char fn[50], sn[50];
    choices:
    cout<<"Please input a corresponding number to perform the listed action to the address book: 0 to exit\n";
        cout<<"Type 1 to print the address book.\n";
        cout<<"Type 2 to search for a person by last name.\n";
        cout<<"Type 3 to print the address, phone, and DOB of a person.\n";
        cout<<"Type 4 to print the names of people whose birth are in a given month.\n";
        cout<<"Type 5 to print the names of all people having the same status.\n";
        cout<<"Type 6 to print all names between two given last names.\n";
        cout<<"Type 7 to find all people with a birthdate between 2 given dates.\n";
        cin>>choice;
        cout<<endl;
        if(choice==0){goto programend;}
        if((choice<0) || (choice>7)){cout<<"Incorrect choice please try again.\n";goto choices;}
        if(choice==1){
            for(int i=0;i<b;i++){
                arrayObj.list[i].printperson();}
        }
        if(choice==2){
            cout<<"Please enter the last name to search for.\n";
            cin>>last;
            cout<<endl;
            arrayObj.findlastname(last);
        }
        if(choice==3){
            cout<<"Please enter the first name of a person to search for.\n";
            cin>>first;
            cout<<"Please enter the last name.\n";
            cin>>last;
            cout<<endl;
            arrayObj.findperson(first, last);
        }
        if(choice==4){
            cout<<"Please enter a birth month to search for in numerical format.(Ex. 1 for January)\n";
            cin>>m;
            cout<<endl;
            arrayObj.findbirthmonth(m);
        }
        if(choice==5){
            cout<<"Please enter the status to search for.(friend,business, or family)\n";
            cin>>status;
            cout<<endl;
            arrayObj.findstatus(status);
        }
        if(choice==6){
            cout<<"Please enter the first last name.\n";
            cin>>fn;
            cout<<endl;
            cout<<"Please enter the second last name.\n";
            cin>>sn;
            cout<<endl;
            arrayObj.findnames(fn, sn);
        }
        if(choice==7){
            cout<<"Please enter the first date starting with day.\n";
            cin>>d1;
            cout<<"Month:\n";
            cin>>m1;
            cout<<"and Year:\n";
            cin>>y1;
            cout<<endl;
            cout<<"Please enter the second date starting with day.\n";
            cin>>d2;
            cout<<"Month:\n";
            cin>>m2;
            cout<<"and Year:\n";
            cin>>y2;
            cout<<endl;
            arrayObj.findbirth(d1,m1,y1,d2,m2,y2);
        }
        goto choices;
        programend:

    //arrayListType<extPersonType> lst2= arrayListType<elemType>(lst1);
    //arrayListType(arrayListType<elemType>, lst1);
    //arrayListType<extPersonType[]> ls(lst1);
    //list<extPersonType>::iterator p=lst1.begin();
    /*while){

        p->printperson();
            p->;
            p++;}*/
    //arrayObj.print();



    getch();
}

OK, first off, you are making one of the classic mistakes mew C++ programmers make: putting the implementation of non-template classes inside the header file. Header files ought to have only global declarations, class and struct definitions, and preprocessor directives (templates are an exception to this, because of the limitations of most linkers and object formats). You will want to move the actual function implementations into separate files in the same project, and let them get compiled separated and linked in at build time.

Second. I think you've misunderstood the rules about default c'tors. If a class has no declared constructor, then the compiler will generate one for it; if, on the other hand, it has one or more non-default c'tors, then there must also be a declared default c'tor for the default c'tor to be built. If the class doesn't use an explict constructor, then it doesn't need to have a declared constructor, period.

Third, if you do declare a constructor, and it is relatively short, it should be possible to implement it inline, in the class definition, like so:

class personType
{
public:
    personType()
    {
        return;
    };
    void print();
    string firstname;
    string lastname;
};

This should get inlined just like the other inline methods.

Hi Schol-R-Lea:

Thank you very much for your comments.

I have a concern. You say that it is a rookie mistake to place standard classes in the header file but I have a text book does it extensively and even teaches it in a few places. Do you believe the tectbook may have not the correct information?

Also I am unable to compile the program without adding default constructors for some reason. If I leave out the default constructor I receive the linker 2019 error. The only way I could get rid of the linker error was to declare a default within the class and define it outside of the class.

I do understand the basics of classes and this is why I was having so many problems with this excercise is because it was not allowing me to construct the classes.

Another problem I had with this program is that I cannot find a way to declare a deconstructor at all without receiving the linker error.

As far as the classes being in the headers I do not understand why the textbook as well as the companion files would place the classes within the header files if that is not the intended way to implement them.

Again, thank you very much for your support.

Best,

Dani

The class declarations should indeed be in the header files; but the implementations ought to be in a separate source file. so, given your code, you would have this part in the header:

`

class personType
{
public:
    personType();
    void print();
    string firstname;
    string lastname;
};

but this part would be in a source file:

personType::personType(){}

just like with the print() method, which you would need to include in your solution/project.

I've tested the following version of your class, and it cmpiles and links flawlessly under Visual Studio Express 2010:

class personType
{
public:
    void print();
    std::string firstname;
    std::string lastname;
};

This may, however, be in part because you don't actually use the c'tor in question explicitly (or the print() method for that matter).

BTW, who the hell tought you to use goto for writing loops? One piece of advice? DON'T. EVER. DO. THAT.

Seriously, goto presents grave problems for writing understandable code, and unless you are in a situation where there is absolutely no alternative, it should be avoided at all costs. The entire lop could be far more comprehensibly written as the following:

    bool exit = false;

    while (!exit)
    {
        cout<<"Please input a corresponding number to perform the listed action to the address book: 0 to exit\n";
        cout<<"Type 1 to print the address book.\n";
        cout<<"Type 2 to search for a person by last name.\n";
        cout<<"Type 3 to print the address, phone, and DOB of a person.\n";
        cout<<"Type 4 to print the names of people whose birth are in a given month.\n";
        cout<<"Type 5 to print the names of all people having the same status.\n";
        cout<<"Type 6 to print all names between two given last names.\n";
        cout<<"Type 7 to find all people with a birthdate between 2 given dates.\n";
        cin>>choice;
        cout<<endl;

        switch(choice)
        {
        case 0:
            exit = true;
            break;
        case 1:
            for(int i=0;i<b;i++){
                arrayObj.list[i].printperson();}
            break;
        case 2:
            cout<<"Please enter the last name to search for.\n";
            cin>>last;
            cout<<endl;
            arrayObj.findlastname(last);
            break;
        case 3:
            cout<<"Please enter the first name of a person to search for.\n";
            cin>>first;
            cout<<"Please enter the last name.\n";
            cin>>last;
            cout<<endl;
            arrayObj.findperson(first, last);
            break;
        case 4:
            cout<<"Please enter a birth month to search for in numerical format.(Ex. 1 for January)\n";
            cin>>m;
            cout<<endl;
            arrayObj.findbirthmonth(m);
            break;
        case 5:
            cout<<"Please enter the status to search for.(friend,business, or family)\n";
            cin>>status;
            cout<<endl;
            arrayObj.findstatus(status);
            break;
        case 6:
            cout<<"Please enter the first last name.\n";
            cin>>fn;
            cout<<endl;
            cout<<"Please enter the second last name.\n";
            cin>>sn;
            cout<<endl;
            arrayObj.findnames(fn, sn);
            break;
        case 7:
            cout<<"Please enter the first date starting with day.\n";
            cin>>d1;
            cout<<"Month:\n";
            cin>>m1;
            cout<<"and Year:\n";
            cin>>y1;
            cout<<endl;
            cout<<"Please enter the second date starting with day.\n";
            cin>>d2;
            cout<<"Month:\n";
            cin>>m2;
            cout<<"and Year:\n";
            cin>>y2;
            cout<<endl;
            arrayObj.findbirth(d1,m1,y1,d2,m2,y2);
            break;
        default:
            cout<<"Incorrect choice please try again.\n";
            break;
        }

    }

Not only is it clearer that it actually is a loop, it avoids the special case of exiting the loop.

The goto statement is not evil, per se, as some will claim, but it is ripe for misuse and abuse. It is best to avoid it whenver possible. Most textbooks these days don't even mention goto for this reason, and if yours recommends using it, I would burn the book.

Oh, and you should use <cstdio> and <cassert> rather than the C-style <stdio.h> and <assert.h>. When C++ was standardized in 1998, all the standard headers were changed to remove the .h extension, in part to differentiate C++ from C. At the same time, all the C headers were prepended with a letter c, e.g., <cstlib>, <ctime>, <cstdio>, and so forth. If your book shows the old style headers, it is at least fifteen years out of date and probably should be dropped in favor of one written in this century.

Also, the <conio.h> header is both non-standard and archaic, and will probably not be supported much longer by, well, anybody. Don't use it.

Finally, you should generally avoid using the using namespace directive in header files, mainly because it undermines the purpose of namespaces in the first place. Use the explicit scoping for all standard functions and classes in header files to avoid namespace pollution.

Edited 3 Years Ago by Schol-R-LEA

Schol-R-LEA:

First, let me thank you for all your help. It is helping me alot !

When I try to type:

1.  class personType
2.  {
3.  public:
4.      void print();
5.      std::string firstname;
6.      std::string lastname;
7.  };

I get the linker error every time I try to build an instance of that class in the main file. I am certain that it is something in the header file but I have gone over it so many times but I cannot figure it out. You can even comment out all contents of the header file and type just those 7 lines. But when you type personType p; in the main file you get the linker error. This is the problem that I was having with that exercise. If you use brand new files this does not happen it only happens with these 2 specific files or when the lines are copied to a new file.

Best,

Dani

This article has been dead for over six months. Start a new discussion instead.