gpt4 book ai didi

c++ - 错误信息 : non-static member found in multiple base-class subobjects of type person

转载 作者:行者123 更新时间:2023-11-30 05:34:30 26 4
gpt4 key购买 nike

// Homework 3.cpp : Defines the entry point for the console application.
//

#include <iostream>
#include <string>
#include <iomanip>
#include <cassert>

using namespace std;

class Person{
public:
Person(){ //Default Constructor
name = "";
ssn = 0;
age = 0;
gender = "";
address = "";
phone = "";
}

Person(const Person& p){ //copy constructor
name = p.name;
ssn = p.ssn;
age = p.age;
gender = p.gender;
address = p.address;
phone = p.phone;
}

Person(string _name, int _ssn, int _age, string _gender, string _address, string _phone)
{
name = _name;
ssn = _ssn;
age = _age;
gender = _gender;
address = _address;
phone = _phone;
}

const string getName(){ return name; }
const int getSSN(){ return ssn; }
const int getAge(){ return age; }
const string getGender(){ return gender; }
const string getAddress(){ return address; }
const string getPhone(){ return phone; }

void setName(const string name);
void setSSN(const int ssn);
void setAge(const int age);
void setGender(const string gender);
void setAddress(const string address);
void setPhone(const string phone);

protected:
string name;
int ssn;
int age;
string gender;
string address;
string phone;

};

class Student : public Person{
public:
Student(){ //default
gpa = 0;
major = "";
gradYear = 0;
}

Student(const Student& s) //copy
{
gpa = s.gpa;
major = s.major;
gradYear = s.gradYear;
}

Student(string _name, int _ssn, int _age, string _gender, string _address, string _phone, double _gpa, string _major, int _gradYear) : Person(_name, _ssn, _age, _gender, _address, _phone){
gpa = _gpa;
major = _major;
gradYear = _gradYear;
}


const double getGPA(){ return gpa; }
const string getMajor(){ return major; }
const int getGradYear(){ return gradYear; }

void setGPA(const double gpa);
void setMajor(const string major);
void setGradYear(const int gradYear);

protected:
double gpa;
string major;
int gradYear;
};

class Employee : public Person{
public:
Employee(){
department = "";
jobTitle = "";
yearHire = 0;
}

Employee(const Employee& e){
department = e.department;
jobTitle = e.jobTitle;
yearHire = e.yearHire;
}

Employee(string _name, int _ssn, int _age, string _gender, string _address, string _phone, string _department, string _jobTitle, int _yearHire) : Person(_name, _ssn, _age, _gender, _address, _phone){
department = _department;
jobTitle = _jobTitle;
yearHire = _yearHire;
}

const string getDepartment(){ return department; }
const string getJobTitle(){ return jobTitle; }
const int getYearHire(){ return yearHire; }

void setDepartment(const double department);
void setJobTitle(const double jobTitle);
void setYearHire(const double yearHire);


virtual double getAnnualWages() = 0; // a pure virtual function.

protected:
string department;
string jobTitle;
int yearHire;
};

class HourlyEmployee : public Employee{
public:
HourlyEmployee(){
hourlyRate = 0;
hoursWorked = 0;
unionDues = 0;

}

HourlyEmployee(const HourlyEmployee& he){
hourlyRate = he.hourlyRate;
hoursWorked = he.hoursWorked;
unionDues = he.unionDues;
}

HourlyEmployee(string _name, int _ssn, int _age, string _gender, string _address, string _phone, string _department, string _jobTitle, int _yearHire, double _hourlyRate, double _hoursWorked, double _unionDues):Employee(_name, _ssn, _age, _gender, _address, _phone, _department, _jobTitle, _yearHire){
hourlyRate = _hourlyRate;
hoursWorked = _hoursWorked;
unionDues = _unionDues;
}

const double getHourlyRate(){ return hourlyRate; }
const double getHoursWorked(){ return hoursWorked; }
const double getUnionDues(){ return unionDues; }

void setHourlyRate(const double hourlyRate);
void setHoursWorked(const double hoursWorked);
void setUnionDues(const double unionDues);

double getAnnualWages(){ return (hourlyRate*hoursWorked) + unionDues; }

protected:
double hourlyRate;
double hoursWorked;
double unionDues;

};

class SalariedEmployee : public Employee{
public:
SalariedEmployee(){ annualSalary = 0; }

SalariedEmployee(const SalariedEmployee& se){
annualSalary = se.annualSalary;
}

SalariedEmployee(string _name, int _ssn, int _age, string _gender, string _address, string _phone, string _department, string _jobTitle, int _yearHire, double _annualSalary):Employee(_name, _ssn, _age, _gender, _address, _phone, _department, _jobTitle, _yearHire)
{
annualSalary = _annualSalary;
}

double getAnnualSalary(){ return annualSalary; }

void setAnnualSalary(const double annualSalary);

double getAnnualWages(){ return annualSalary; }

protected:
double annualSalary;

};

class StudentEmployee : public Student, public HourlyEmployee{ //multiple inheritance of student and HourlyEmployee
public:


StudentEmployee(){}

StudentEmployee(const StudentEmployee& ste){}

StudentEmployee(string _name, int _ssn, int _age, string _gender, string _address, string _phone, string _department, string _jobTitle, int _yearHire, double _hourlyRate, double _hoursWorked, double _unionDues,double _gpa, string _major, int _gradYear): Student(_name, _ssn, _age, _gender, _address, _phone, _gpa, _major, _gradYear), HourlyEmployee(_name, _ssn, _age, _gender, _address, _phone, _department, _jobTitle, _yearHire, _hourlyRate, _hoursWorked, _unionDues){}



protected:
};

struct ListNode { //struct for list
Person p;
ListNode *link;
};

class SingleLinkedList{ //class to store all persons
public:
SingleLinkedList() {
front = rear = nullptr;
size = 0;
}

~SingleLinkedList() {
Clear();
}

ListNode* headptr(){
return front;
}

// Removes every node in the list. Frees my memory with delete.
void Clear() {
ListNode *node = front;

while (node != nullptr) {
ListNode *next = node->link;
delete node;
node = next;
}

front = rear = nullptr;
size = 0;
}

bool Contains(Person p) const {
ListNode *node = front;

while (node != nullptr) {
if ( node->p.getName() == p.getName() && node->p.getSSN() == p.getSSN() && node->p.getAge() == p.getAge() && node->p.getGender() == p.getGender() && node->p.getAddress() == p.getAddress() && node->p.getPhone() == p.getPhone() ) { return true; } //checks to see if all of the information for the person is the same
node = node->link;
}

return false;
}

void PopFront() {
assert(size > 0);

ListNode *obsolete = front;

if (front == rear) { // Exactly one element in our list
front = rear = nullptr;
}
else {
front = obsolete->link;
}

delete obsolete;
--size;
}

void PushBack(Person p) {
ListNode *insert = new ListNode(); // We need to delete this node later
insert->p = p;
insert->link = nullptr;

if (front == nullptr) {
front = rear = insert;
}

rear->link = insert;
rear = insert;
++size;
}

void PushFront(Person p) {
ListNode *insert = new ListNode();
insert->link = front; // This node will be the new front, connect the old front
insert->p = p;

if (front == nullptr) { // No elements currently in the list
front = rear = insert;
}

front = insert;
++size;
}

int Size() const {
return size;
}

void displayNode(ListNode *ptr)const{
cout << setw(3) << ptr->p.getName() << endl;
}

void displayList(ListNode *ptr)const{
if (ptr==nullptr){
cout << "Nothing to display!\n";
}
for (int i = 1; i <= size;i++){
displayNode(ptr);
ptr = ptr->link;
}
}

protected:
int size;
ListNode *front, *rear; // Front points to first node in list, rear to last
};








//main program
int main()
{
Person a("John Doe", 123456789, 26, "male", "123 Park Pl", "555-123-4567");
Person b("Jane Smith", 234567890, 21, "female", "66 Oak Ave", "123-456-7890");
Student s("Katie Brown",749374394, 18,"female","100 Curtain Rd","472-473-2038", 4.0, "Statistics", 2016);
SalariedEmployee se("Ross Gellar", 123056789, 55, "male", "123 5th Ave", "515-683-8924", "Science", "Professor", 1999, 50000);
HourlyEmployee he("Monica Bing", 123056589, 55, "female", "64 South Park Dr", "538-238-0747", "Dining", "Chef", 1999, 20.00, 40, 100);
StudentEmployee stuem("Cathrine Miller", 550789234, 25, "female", "218 Knickerbocker Way", "888-555-0000", "Fitness", "Trainer", 2015, 7.25, 10, 5, 3.2, "Computer Science", 2017);


SingleLinkedList x;
x.PushBack(a);
x.PushBack(b);
x.PushFront(s); //adds student f to the list of persons
x.displayList(x.headptr());

if (x.Contains(a) == true) //to show john doe is on list
cout << "This " << a.getName() << " is in the list.\n";
else
cout << "This " << a.getName() << " is NOT in the list.\n";

x.Clear(); //clears list

x.displayList(x.headptr());

if (x.Contains(a) == true) //shows john doe not on list because list was cleared
cout << "This " << a.getName() << " is in the list.\n";
else
cout << "This " << a.getName() << " is NOT in the list.\n";


cout<< "Annual Wages for "<<se.getName()<<" is "<<se.getAnnualWages()<<endl;
cout<< "Annual Wages for "<<he.getName()<<" is "<<he.getAnnualWages()<<endl;
cout<< "Annual Wages for "<<stuem.getName()<<" is "<<stuem.getAnnualWages()<<endl;


return 0;
}

在最后一个 cout 语句中,我的程序将给我错误消息 non-static member 'getName' found in multiple base-class subobjects of type person。我知道我必须将所有变量都引用到一个基类中,但我不知道该怎么做

最佳答案

在这种情况下,您必须使用 Personvirtual 继承。我想这就是这个作业的重点。你遇到了 The Diamond problem ,因为在 stuem.getName() 中,编译器不知道要使用两个底层 Person 基类实例的哪个实例。

使继承虚拟 将确保只有一个Person 对象:

class Student : virtual public Person { ... };
class Employee : virtual public Person { ... };

题外话,但此时您应该使用成员初始化列表并将 "" 分配给已经初始化且为空的 std::string,嗯,看着不舒服。在 C++11 中可以默认复制构造函数:

Person(const Person& p) = default;

关于c++ - 错误信息 : non-static member found in multiple base-class subobjects of type person,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34228048/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com