我想使用5个特定的类来设计结构:人,驱动程序,雇员,孩子和父母。
-每个驾驶员都是一个人。
-每个员工都是司机和一个人。
-每个孩子都是一个人。
-每个父母都是一个人,司机,雇员,可以有一个或多个孩子。
这就是我的想法:
class Parent {
public:
class Employee {
public:
class Driver {
public:
class Person {
string name;
int age;
public:
string GetName() { return name; }
void SetName(string name) { this->name = name; }
int GetAge() { return age; }
void SetAge(int age) { this->age = age; }
};
private:
Person person;
string carName;
public:
Person GetPerson() { return person;}
void SetPerson(Person person) { this->person = person;}
string GetCarName() { return carName; }
void SetCarName(string carName) { this->carName = carName;}
};
private:
Driver driver;
public:
Driver GetDriver() { return driver; }
void SetDriver(Driver driver) { this->driver = driver; }
};
class Child {
public:
class Person:public Employee::Driver::Person {
};
private:
Person person;
string nameOfSchool;
public:
Person GetPerson() { return person; }
void SetPerson(Person person) { this->person = person;}
string GetNameOfSchool(){ return nameOfSchool;}
void SetNameOfSchool(string nameOfSchool) { this->nameOfSchool = nameOfSchool;}
};
private:
Employee employee;
Child child;
public:
Employee GetEmployee() { return employee; }
void SetEmployee(Employee employee) { this->employee = employee;}
Child GetChild() { return child;}
void SetChild(Child child) { this->child = child;}
};
但是当我尝试类似的操作时:
Parent random_parent;
random_parent.GetEmployee().GetDriver().GetPerson().SetName("Joseph");
random_parent.GetEmployee().GetDriver().GetPerson().SetAge(80);
cout << random_parent.GetEmployee().GetDriver().GetPerson().GetName() << endl << random_parent.GetEmployee().GetDriver().GetPerson().GetAge();
我只得到这个垃圾值:
-858993460
如何使Parent
的任何实例正常工作,并能够从内部类name
访问和初始化age
和Person
?
答案 0 :(得分:1)
从设计角度而言,驾驶员,雇员,子女和父母不是人的后代。他们是角色,一个人可以扮演任何角色。或者,它们可以是两个人之间的关系,例如,一个人是一个人的孩子,另一个人的父母。
答案 1 :(得分:0)
GetPerson
,GetDriver
,GetChild
和GetEmployee
应该返回引用或指针。现在,当您调用random_parent.GetEmployee()
时,它将返回一个全新的临时Employee
对象,该对象是random_parent
中一个对象的副本。如果您执行random_parent.GetEmployee().SetDriver(new_driver)
,则它将驱动程序设置在这个全新的Employee
对象中,而不是random_parent
中的对象。语句执行后,临时Employee
对象将被丢弃。
如果您更改
Employee GetEmployee() { return employee; }
到
// here
// |
// V
Employee& GetEmployee() { return employee; }
然后,random_parent.GetEmployee()
将返回对employee
中random_parent
对象的 reference 。 random_parent.GetEmployee().SetDriver(new_driver);
将更新该对象,这就是您期望发生的情况。
对GetDriver
,GetPerson
和GetChild
做同样的事情。
这可以解决您的直接问题。但是,您的代码设计不佳。您可以在Code Review上获得设计建议。