如何使用包含内部类的类的实例有效地从内部类访问成员?

时间:2019-12-06 09:46:13

标签: c++ oop inner-classes

我想使用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访问和初始化agePerson

2 个答案:

答案 0 :(得分:1)

从设计角度而言,驾驶员,雇员,子女和父母不是人的后代。他们是角色,一个人可以扮演任何角色。或者,它们可以是两个人之间的关系,例如,一个人是一个人的孩子,另一个人的父母。

答案 1 :(得分:0)

GetPersonGetDriverGetChildGetEmployee应该返回引用或指针。现在,当您调用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()将返回对employeerandom_parent对象的 reference random_parent.GetEmployee().SetDriver(new_driver);将更新该对象,这就是您期望发生的情况。

GetDriverGetPersonGetChild做同样的事情。


这可以解决您的直接问题。但是,您的代码设计不佳。您可以在Code Review上获得设计建议。