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



如果我有一个类包含另一个类(通过组合(,而这个类又包含另一类。例如:包含PersonalDetails类的Teacher类,该类包含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;是为所有类中的成员变量提供getters方法。但这似乎是个坏主意,因为教师类最终会有很多getter方法。尤其是如果我将来要添加更多的类。

解决方案2;是返回实例本身。我不知道这是更好还是打破了任何最佳实践。但是您可以使用Teacher类中的实例对其调用getEmail((。

解决方案3;正在使用朋友类(没有太多使用它们的经验(。但由于您仍然需要传递ContactInformation的实例才能获得m_ email。它似乎与解决方案2没有太大区别。

有没有办法让教师班成为ContactInformation班的朋友(或其他什么(,这样我就可以做这样的事情:

teacher.getEmail(); 

除了ContactInformation中的getter之外,不需要任何getter?

friends类的问题是,您将失去(在未来(将ContactInformation用于不同于Teacher的类的可能性,而不会从中获得太多好处。

如果PeronalDetailsTeacher的成员并且ContactInformationPeronalDetails的成员。您可以简单地使用teacher.personalDetails.contactInformation.m_email,它相当长,并且要求所有这些成员都是public

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

public:
Teacher::getEmail(){
return personalDetails.contactInformation.m_email;
}

最新更新