0

在一个项目中,我有一个类层次结构来实现一个具有层次结构级别的图(也就是说,一个图节点可以是一个图本身 - 将其视为一个电子电路,其中一个门实际上可以是一个集成芯片,例如)。因此,我有一些Base派生到GroupandLeaf的类,并且该类Base有一个属性ancestor,我希望能够从Group(添加子项时)的给定方法设置它,但不能从其他任何地方设置:

class Group;

class Base {
    private: // or protected?
        Group* ancestor;
};

class Group : public Base {
    private:
        void setAncestor(Base* child) {
            // Something like
            child->ancestor = this;
        }
};

class Leaf : public Base {
    // ...
};

实现这一目标的“正确”方法是什么?通常,我会使用friend方法,但在我看来,这在这种情况下是不可能的,因为我必须在 中声明朋友Group::setAncestorBase这必须在之前声明。(另请注意,这些声明位于实际代码中的不同文件中。)

4

2 回答 2

0

您可以在 中将其声明为受保护Base,并在Leaf类中以及从其他任何地方使用私有继承,因此受保护的成员将是私有的。

class Group;

class Base {
    protected:
        Group* ancestor;
};

class Group : public Base {
    private:
        void setAncestor(Base* newAncestor) {
            // Something like
            ancestor = newAncestor->ancestor;
        }
};

class Leaf : private Base {
    // ...
};

请注意,我将名称从 更改childnewAncestor

因此,当您创建一个新孩子时,您可以执行以下操作:

Base ancestor;
Group child;
child->setAncestor(&ancestor)
于 2017-03-27T15:50:11.770 回答
0

数据成员 Base::ancestor 应该具有受保护的访问权限。这样它就可以用于派生类。

于 2017-03-27T15:40:44.843 回答