dimanche 9 mai 2021

ERROR: a missing vtable usually means the first non-inline virtual member function has no definition

I am working on a project dealing with inheritance in C++. My build keeps failing for some reasons dealing with missing vtables. A portion of the output is

"CustomerData::~CustomerData()", referenced from:
      _main in main.o
  "vtable for CustomerData", referenced from:
      CustomerData::CustomerData() in main.o

This is my code:

#include <iostream>
#include <string>

using namespace std;

class PersonData{
protected:
    string lastName;
    string firstName;
    string address;
    string city;
    string state;
    int zip;
    string phone;
public:
    PersonData();
    virtual ~PersonData();
    virtual void setLastName(string);
    virtual void setFirstName(string);
    virtual void setAddress(string);
    virtual void setCity(string);
    virtual void setState(string);
    virtual void setZip(int);
    virtual void setPhone(string);
    
    
    string getLastName() const;
    string getFirstName() const;
    string getAddress() const;
    string getCity() const;
    string getState() const;
    int getZip() const;
    string getPhone() const;
};
void PersonData::setLastName(string s){
    lastName = s;
}
void PersonData::setFirstName(string s){
    firstName = s;
}
void PersonData::setAddress(string s){
    address = s;
}
void PersonData::setCity(string s){
    city = s;
}
void PersonData::setState(string s){
    state = s;
}
void PersonData::setZip(int i){
    zip = i;
}
void PersonData::setPhone(string s){
    phone = s;
}

string PersonData::getLastName() const{
    return lastName;
}
string PersonData::getFirstName() const{
    return firstName;
}
string PersonData::getAddress() const{
    return address;
}
string PersonData::getCity() const{
    return city;
}
string PersonData::getState() const{
    return state;
}
int PersonData::getZip() const{
    return zip;
}
string PersonData::getPhone() const{
    return phone;
}
class CustomerData : public PersonData{
private:
    int customerNumber;
    bool mailingList = true;
public:
    CustomerData();
    virtual ~CustomerData();
    void setCustomerNumber(int);
    void setMailingList(bool);
    void setLastName(string) override;
    void setFirstName(string) override;
    void setAddress(string) override;
    void setCity(string) override;
    void setState(string) override;
    void setZip(int) override;
    void setPhone(string) override;

    int getCustomerNumber() const;
    bool getMailingList() const;
};
CustomerData::CustomerData(){ 
    lastName="";firstName="";address="";city="";state="";zip=0;phone="";customerNumber=0;mailingList=true; 
}

void CustomerData::setCustomerNumber(int i){
    customerNumber = i;
}
void CustomerData::setMailingList(bool i){
    mailingList = i;
}
int CustomerData::getCustomerNumber() const{
    return customerNumber;
}
bool CustomerData::getMailingList() const{
    return mailingList;
}





int main(int argc, char** argv) {
    CustomerData p1;
    char s;
    p1.setLastName("Obeid");
    p1.setFirstName("Yahya");
    p1.setAddress("1234 Fake Street");
    p1.setCity("Santa Clara");
    p1.setState("California");
    p1.setZip(95051);
    p1.setPhone("(408)-555-5555");
    p1.setCustomerNumber(21);
    cout<<"Do you wish to be on the mailing list? (y/n): ";
    cin>>s;
    if(s=='n'||s=='N'){
        p1.setMailingList(false);
    }
    cout<<"NAME: "<<p1.getFirstName()<<" "<<p1.getLastName()<<endl;
    cout<<"ADDRESS: "<<p1.getAddress()<<endl;
    cout<<"CITY: "<<p1.getCity()<<endl;
    cout<<"STATE: "<<p1.getState()<<endl;
    cout<<"ZIP: "<<p1.getZip()<<endl;
    cout<<"PHONE: "<<p1.getPhone()<<endl;
    cout<<"CUSTOMER NUMBER: "<<p1.getCustomerNumber()<<endl;
    cout<<"MAILING LIST: "<<p1.getMailingList()<<endl;
}

The reason I put all of my code is because I don't know what is causing the problem. If anyone can help me that would be appreciated.

Aucun commentaire:

Enregistrer un commentaire