2015-04-02 2 views
0

Я сделал класс наследования с базового класса PersonНаследование человек класс не работает

Person.h

#include <iostream> 
#include <string> 

using namespace std; 

class Person 
{ 
    friend ostream& operator<<(ostream &os, const Person &p); 
    friend istream& operator>>(istream &is, Person &p); 
private: 
    char* m_name; 
    int m_age; 
    string m_ssn; 
protected: 
    virtual void Read(istream &is); 
    virtual void Write(ostream &os) const; 
public: 
    Person(); 
    Person(const char* const name, int age, const string &ssn); 
    Person(const Person &p); 
    ~Person(); 
    Person & operator = (const Person& other); 
    virtual string getName() const; 
    virtual int getAge() const; 
    virtual string getSSN() const; 
    void setName(const char* const name); 
    void setAge(int age); 
    void setSSN(string ssn); 
    string getType() const; 
}; 

Person.cpp

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

 
using namespace std; 
 

 
ostream& operator<<(ostream &os, const Person &p) 
 
{ 
 
\t p.Write(os); 
 
\t return os; 
 
} 
 

 
istream& operator>>(istream &is, Person &p) 
 
{ 
 
\t p.Read(is); 
 
\t return is; 
 
} 
 

 
Person::Person() 
 
{ 
 
\t m_name = new char[10]; 
 

 
\t for (int i = 0; i < 10-1; i++) 
 
\t { 
 
\t \t m_name[i] = 'X'; 
 
\t } 
 
\t m_name[10 - 1] = '\0'; 
 

 
\t m_age = 0; 
 
\t m_ssn = "XXX-XX-XXXX"; 
 
} 
 

 
Person::Person(const char* name, int age, const string &ssn) 
 
{ 
 
\t m_name = new char[(int)strlen(name)+1]; 
 

 
\t for (int y = 0; y < (int)strlen(name); y++) 
 
\t \t m_name[y] = name[y]; 
 
\t m_age = age; 
 
\t m_ssn = ssn; 
 
} 
 

 
Person::Person(const Person& P) 
 
{ 
 
\t m_name = new char[(int)strlen(P.m_name)+1]; 
 

 
\t for (size_t i = 0; i <= (int)strlen(P.m_name); i++) 
 
\t { 
 
\t \t m_name[i] = P.m_name[i]; 
 
\t } 
 
\t m_age = P.m_age; 
 
\t m_ssn = P.m_ssn; 
 
} 
 

 
Person::~Person() 
 
{ 
 
\t delete[] m_name; 
 
} 
 

 
Person& Person::operator=(const Person& other) 
 
{ 
 
\t if (this == &other) 
 
\t \t return *this; 
 
\t delete [] m_name; 
 

 
\t m_name = new char[(int)strlen(other.m_name) + 1]; 
 
\t for (int i = 0; i <= (int)strlen(other.m_name); i++) 
 
\t { 
 
\t \t m_name[i] = other.m_name[i]; 
 
\t } 
 

 
\t m_age = other.m_age; 
 
\t m_ssn = other.m_ssn; 
 
} 
 

 
string Person::getName() const 
 
{ 
 
\t return string(m_name); 
 
} 
 

 
int Person::getAge() const 
 
{ 
 
\t return int(m_age); 
 
} 
 

 
string Person::getSSN() const 
 
{ 
 
\t return string(m_ssn); 
 
} 
 

 
void Person::setName(const char* const name) 
 
{ 
 
\t delete[] m_name; 
 
\t m_name = new char[(int)strlen(name) + 1]; 
 

 
\t for (int i = 0; i <= (int)strlen(name); i++) 
 
\t { 
 
\t \t m_name[i] = name[i]; 
 
\t } 
 
} 
 

 
void Person::setAge(int age) 
 
{ 
 
\t m_age = age; 
 
} 
 

 
void Person::setSSN(string ssn) 
 
{ 
 
\t m_ssn = ssn; 
 
} 
 

 
string Person::getType() const 
 
{ 
 
\t return string("Person"); 
 
} 
 

 
void Person::Write(ostream &os) const 
 
{ 
 
\t if (&os == &cout) 
 
\t { 
 
\t \t os << "Name: " << m_name << "\nAge: " << m_age << "\nSSN: " << m_ssn; 
 
\t } 
 
\t else 
 
\t \t os << m_name << "\n" << m_age << "\n" << m_ssn; 
 
} 
 

 
void Person::Read(istream &is) 
 
{ 
 
\t string name; 
 
\t if (&is == &cin) 
 
\t { 
 
\t \t cout << "Enter the Name: " << flush; 
 
\t \t getline(is, name); 
 
\t \t if (name.length() == 0) 
 
\t \t \t getline(is, name); 
 
\t \t cout << "Enter the Age: " << flush; 
 
\t \t is >> m_age; 
 
\t \t cout << "Enter the SSN: " << flush; 
 
\t \t getline(is, m_ssn); 
 
\t \t is.get(); 
 
\t } 
 
\t else 
 
\t { 
 
\t \t getline(is, name); 
 
\t \t if (!is) 
 
\t \t \t return; 
 
\t \t if (name.length() == 0) 
 
\t \t \t getline(is, name); 
 
\t \t is >> m_age; 
 
\t \t getline(is, m_ssn); 
 
\t \t is.get(); 
 
\t } 
 
\t delete[] m_name; 
 
\t m_name = new char[name.length() + 1]; 
 
\t for (int i = 0; i < (int)name.length(); i++) 
 
\t { 
 
\t \t m_name[i] = name[i]; 
 
\t } 
 
\t m_name[name.length()] = '\0'; 
 
}

I «Я даже не собираюсь вкладывать в наследующий класс, который является Student, потому что я уже получаю ошибки, когда тестирую свой класс Person.

Я пытался в моем основном следующем:

#include "Person.h" 
 
#include "Student.h" 
 

 
int main() 
 
{ 
 

 
\t Person ptr2Stu("Joe", 22, "123-45-6678"); 
 
\t cout << ptr2Stu.getName() << endl; 
 
\t cout << ptr2Stu.getAge() << endl; 
 
\t cout << ptr2Stu.getSSN() << endl; 
 
\t cout << ptr2Stu.getType() << endl; 
 

 
\t system("pause"); 
 
}

Я получаю ошибки при попытке построить это.

+1

Какие ошибки вы получаете, и сколько из них вы добавили с момента, когда код работал отлично? – Beta

ответ

1

Существует проблема в Person.cpp

Person::Person(const char* name, int age, const string &ssn) 

В файле заголовка, декларация

Person(const char* const name, int age, const string &ssn); 
        ^^^^ 

Таким образом, измените либо из декларации/определения.

Вы можете опустить приведение в getSSN и getAge.

+0

Или вы можете изменить как декларацию, так и определение. Сделайте интерфейс не загроможден с помощью 'const', который ничего не меняет для вызывающего и делает определение принудительным, чтобы вы не меняли параметр. – chris

+0

Спасибо, Крис за указание. – doptimusprime

Смежные вопросы