我目前正在重新设计一个C ++项目,并希望在具有“具有”(组合)关系的类需要访问可能属于父项的变量时,如何处理变量的一些意见,例如:
计算机对象具有网卡对象。计算机对象具有所有者变量。例如
class Computer {
string get_owner(); // getter as an option?
private:
std::string owner = "baylesj";
NetworkCard nic;
}
class NetworkCard {
public:
NetworkCard(Computer *parent);
send_packet();
broadcast_owner(send_packet(m_parent->owner)); // this is kind of ugly
private:
Computer *m_parent;
}
假设我在网卡中有一个需要所有者的功能。当我在计算机中初始化时,是否更好地将所有者作为网卡的成员变量传递,或者我应该在NetworkCard中有一个可以访问计算机的成员变量,Getter / Setter或其他关系的父指针?我知道在孩子身上有一个指向父母的指针是相当普遍的做法,但这是一个好主意/适当的OOP吗?
**计算机的东西只是例如,IRL它是别的东西所以不要太挂它了:)。
答案 0 :(得分:3)
我看到你认识到最好尽量减少不必要的耦合。为此,您可以将NetworkCard类设计为不知道父级的实现细节。这是一种将名称传递给网络构建广播的方法:
class Computer {
public:
Computer(std::string const &owner) : m_Owner(owner), nic(owner)
{
}
private:
std::string m_Owner;
NetworkCard nic;
};
class NetworkCard {
public:
NetworkCard(std::string const &owner)
{
broadcast_owner(owner);
}
send_packet();
broadcast_owner(std::string const &owner);
private:
};
如果你发现有太多这样的变量要作为构造函数参数传递(我喜欢不超过两三个),那么你可能会发现组合是问题的错误工具。通常参数的数量很小,除非它实际上是一个“is-a”关系,在这种情况下,继承可能是一个更好的工具。