如果我有一个类包含另一个类(通过组合(,而这个类又包含另一类。例如:包含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
的类的可能性,而不会从中获得太多好处。
如果PeronalDetails
是Teacher
的成员并且ContactInformation
是PeronalDetails
的成员。您可以简单地使用teacher.personalDetails.contactInformation.m_email
,它相当长,并且要求所有这些成员都是public
。
中间点可以是个性化的吸气剂:
public:
Teacher::getEmail(){
return personalDetails.contactInformation.m_email;
}