在C ++中访问嵌套组合中的成员

问题描述

如果我的某个班级包含另一个班级(通过合成),而该班级又包含另一个班级。例如:一个包含PersonalDetails类的Teacher类,其中包含一个Contactinformation类。

Contactinformation类:

class Contactinformation
{
private:
    std::string m_email{};
    std::string m_phoneNumber{};

public:
    Contactinformation(const std::string &email,const std::string &phone)
        : m_email{ email },m_phoneNumber{ phone }
    {
    }

    // Solution 1
    const std::string& getEmail() const { return m_email; }
    const std::string& getPhoneNumber() const { return m_phoneNumber; }

    // Solution 2
    const Contactinformation& getContactInfo() const { return *this; }

    // Solution 3
    friend class Teacher;
};

PeronalDetails类:

class PersonalDetails
{
private:
    Contactinformation m_contact;
    std::string m_name;

public:
    PersonalDetails(const Contactinformation &info,const std::string &name)
        : m_contact{ info },m_name{ name }
    {
    }


    // Solution 1
    const std::string& getEmail() const { return m_contact.getEmail(); }
    const std::string& getPhoneNumber() const { return m_contact.getPhoneNumber(); }
    const std::string& getName() const { return m_name; }


    // Solution 2
    const Contactinformation& getContactInfo() const { return m_contact.getContactInfo(); }
    const PersonalDetails& getPersonalDetails() const { return *this; }

    // Solution 3
    friend class Teacher;
};

老师课:

class Teacher
{
private:
    PersonalDetails m_details;
    double m_salary{};

public:
    Teacher(const PersonalDetails &details,double salary)
        : m_details{ details },m_salary{ salary }
    {
    }

    // Solution 1
    const std::string& getEmail() const { return m_details.getEmail(); }
    const std::string& getPhoneNumber() const { return m_details.getPhoneNumber(); }
    const std::string& getName() const { return m_details.getName(); }
    double getSalary() const { return m_salary; }

    void printEmail1() const 
    {
        std::cout << getEmail() << '\n';
    }


    // Solution 2
    const Contactinformation& getContactInfo() const { return m_details.getContactInfo(); }
    const PersonalDetails& getPersonalDetails() const { return m_details.getPersonalDetails(); }

    void printEmail2() const 
    {
        std::cout << getContactInfo().getEmail() << '\n';
    }


    // Solution 3
    const std::string& getTeacherEmail(const Contactinformation &c) const
    {
        return c.getEmail();
    } 

    void printEmail3() const
    {
        std::cout << getTeacherEmail(getContactinformation());
    }

};

教师类在Contactinformation(最“嵌套”的类)中访问成员(m_email和m_phoneNumber)的“正确方法”是什么? 我想不出的两种解决方案似乎都很棒。

解决方案1;在所有类中都有用于成员变量的getter方法。但这似乎是一个坏主意,因为Teacher类最终会使用很多getter方法。特别是如果将来我要添加更多的类。

解决方案2;是要返回实例本身。我不知道这是否更好,或者是否违反了任何最佳做法。但是您可以使用Teacher类中的实例在其上调用getEmail()。

解决方案3;正在使用朋友课程(没有太多使用经验)。但是由于您仍然必须传递一个Contactinformation实例才能获取m_email。与解决方案2似乎没有什么不同。

是否可以通过任何方法使Teacher类与Contactinformation类成为朋友(或其他事物),所以我可以执行以下操作:

teacher.getEmail(); 

除了Contactinformation中的吸气剂外,没有其他吸气剂吗?

解决方法

与朋友班有关的问题是,(将来)您将失去return articles(new ArticlesArgumentsDefinition() { @Override public void define(ArticlesArguments args) { } }); 用于与ContactInformation不同的班级的机会,而不会真正从中受益。

如果TeacherPeronalDetails的成员,并且TeacherContactInformation的成员。您可以简单地PeronalDetails,它很长,并且要求所有这些成员都是teacher.personalDetails.contactInformation.m_email

midlle点可以是个性化的吸气剂:

public