两个成员相互依赖
Two members being dependent on each other?
想象有一个叫做Node
的类,它可以容纳多个父类和多个子类:
class Node {
public:
Node();
virtual void addParent(Node *parent);
virtual void addChild(Node *child);
private:
vector<Node*> m_parents;
vector<Node*> m_children;
};
问题是,每次向节点添加父节点时,节点的m_parents
必须更新,父节点的m_children
必须更新;这会创建一个无限循环。
void Node::addParent(Node *parent)
{
if (m_parents.lacks(parent)) { // supposing such method exists
m_parents.push_back(parent);
}
parent->addChild(this);
}
void Node::addChild(Node *child)
{
if (m_children.lacks(child)) {
m_children.push_back(child);
}
child->addParent(this);
}
正如你所看到的,这是不好的。我通过使用四种方法而不是两种方法来解决这个问题,但这感觉有点愚蠢。另外两个方法都声明为private
或protected
,因此其他人不能调用它们。这里是原始的addParent
和一个名为rawAddChild
的新方法:
void Node::addParent(Node *parent)
{
if (m_parents.lacks(parent)) {
m_parents.push_back(parent);
}
parent->rawAddChild(this);
}
void Node::rawAddChild(Node *child)
{
if (m_children.lacks(child)) {
m_children.push_back(child);
}
// Doesn't call for parent's method
}
对于addChild()
和rawAddParent()
,这显然是相同的。
然而,这感觉不像是一个合适的解决方案,而且对于"局外人"来说,当然不清楚为什么会有addChild
和rawAddChild
方法。我的逻辑是否有问题,如果有,我应该如何解决这个问题?还是我的解决方案已经很好了?
我建议只使用两种方法中的一种来执行实际操作:
void Node::addParent(Node *parent)
{
if (m_parents.lacks(parent)) {
m_parents.push_back(parent);
}
if (parent->m_children.lacks(this)) {
parent->m_children.push_back(this);
}
}
void Node::addChild(Node *child)
{
child->addParent(this);
}
我将测试vector是否已经包含该元素(可能使用set而不是vector)
void Node::addParent(Node *parent)
{
if (m_parents.lacks(parent)) { // supposing such method exists
m_parents.push_back(parent);
}
if (parent->m_childs.find(this)==set::end)
parent->addChild(this);
}
void Node::addChild(Node *child)
{
if (m_children.lacks(child)) {
m_children.push_back(child);
}
if (child->m_parents.find(this)==set::end)
child->addParent(this);
}
你应该抽象一点。
bool Node::addParent(Node *parent)
{
if (m_parents.lacks(parent)) { // supposing such method exists
m_parents.push_back(parent);
parent->updateRelationShip(parent,this);
return true;
}
return false;
}
bool Node::addChild(Node *child)
{
if (m_children.lacks(child)) {
m_children.push_back(child);
child->updateRelationShip(this,child);
return true;
}
return false;
}
void Node::updateRelationship(Node*parent, Node* child){
parent->addChild(child);
child->addParent(parent);
}
相关文章:
- 如何添加依赖于类本身的模板成员变量
- 初始化依赖于子类的继承类的常量类成员
- 类成员函数参数列表是否可以依赖于模板参数?
- 依赖于类成员属性的类实例成员
- 类成员和依赖项注入的对象与引用
- 依赖注入:依赖关系需求字段/成员
- 依赖模板基础的受保护成员
- 单独库中的类成员函数定义和链接依赖项
- 依赖于依赖类型的非静态数据成员的非限定名称
- 如何让成员函数实现依赖于类的模板参数?
- 具有依赖于实现的成员函数类型的多个静态接口
- 初始化依赖于另一个类成员的类成员
- 如何处理相互依赖并具有模板成员的类
- 模板成员中的循环类依赖项
- 如何模拟依赖的成员变量
- 无法定义依赖类型定义的成员
- 如何强制依赖静态对象(包括模板成员)的初始化顺序
- 在多继承编译器的情况下访问成员变量是否依赖?如何正确地做
- 无效的模板依赖成员函数模板推导 - 认为我正在尝试使用 std::set
- 当无法重新排序时,依赖成员初始化