如何使用包含内部 classes 的 class 实例从内部 classes 有效地访问成员?
How can I efficiently access members from inner classes using instances of a class which includes inner classes?
我想使用 5 个特定的 classes:Person、Driver、Employee、Child 和 Parent.
设计一个结构
-每个driver都是一个人。
-每个员工既是driver又是人。
-每个child都是一个人。
-每个parent是一个人,driver,employee,它可以有一个或多个child人。
这是我的想法:
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
的任何实例工作并能够从内部 class Person
访问和初始化 name
和 age
?
GetPerson
、GetDriver
、GetChild
和 GetEmployee
应该 return 引用或指针。现在,当您调用 random_parent.GetEmployee()
时,它 return 是一个全新的临时 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()
将 return 引用 到 random_parent
中的 employee
对象。 random_parent.GetEmployee().SetDriver(new_driver);
将更新该对象,这正是您所期望的。
对 GetDriver
、GetPerson
和 GetChild
执行相同操作。
这解决了您眼前的问题。但是,您的代码设计不佳。您可以在 Code Review.
上获得设计建议
Design-wise、driver、员工、child 和 parent 不是 Person 的后代。它们是 roles 并且一个人可以拥有任意数量的角色。或者,它们可以是两个人之间的 关系 ,例如,一个人对一个人 child 而对另一个人 parent。
我想使用 5 个特定的 classes:Person、Driver、Employee、Child 和 Parent.
设计一个结构-每个driver都是一个人。
-每个员工既是driver又是人。
-每个child都是一个人。
-每个parent是一个人,driver,employee,它可以有一个或多个child人。
这是我的想法:
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
的任何实例工作并能够从内部 class Person
访问和初始化 name
和 age
?
GetPerson
、GetDriver
、GetChild
和 GetEmployee
应该 return 引用或指针。现在,当您调用 random_parent.GetEmployee()
时,它 return 是一个全新的临时 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()
将 return 引用 到 random_parent
中的 employee
对象。 random_parent.GetEmployee().SetDriver(new_driver);
将更新该对象,这正是您所期望的。
对 GetDriver
、GetPerson
和 GetChild
执行相同操作。
这解决了您眼前的问题。但是,您的代码设计不佳。您可以在 Code Review.
上获得设计建议Design-wise、driver、员工、child 和 parent 不是 Person 的后代。它们是 roles 并且一个人可以拥有任意数量的角色。或者,它们可以是两个人之间的 关系 ,例如,一个人对一个人 child 而对另一个人 parent。