两个成员相互依赖

Two members being dependent on each other?

本文关键字:依赖 成员 两个      更新时间:2023-10-16

想象有一个叫做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);
}

正如你所看到的,这是不好的。我通过使用四种方法而不是两种方法来解决这个问题,但这感觉有点愚蠢。另外两个方法都声明为privateprotected,因此其他人不能调用它们。这里是原始的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(),这显然是相同的。

然而,这感觉不像是一个合适的解决方案,而且对于"局外人"来说,当然不清楚为什么会有addChildrawAddChild方法。我的逻辑是否有问题,如果有,我应该如何解决这个问题?还是我的解决方案已经很好了?

我建议只使用两种方法中的一种来执行实际操作:

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);
}