Разрешение доступа к члену базового класса из определенного производного класса

В проекте у меня есть иерархия классов, реализующая граф с уровнями иерархии (то есть узел графа может быть самим графом - представьте, что это электронная схема, в которой ворота могут быть, например, интегрированным чипом). Таким образом, у меня есть некоторый класс Base выведено в Group а также Leafи класс 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::setAncestor в Base, который должен быть объявлен ранее. (Также обратите внимание, что эти объявления находятся в разных файлах в реальном коде.)

2 ответа

Вы можете объявить его защищенным в 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 {
    // ...
};

Обратите внимание, что я меняю имя с child в newAncestor,

Поэтому, когда вы создаете нового ребенка, вы можете сделать что-то вроде этого:

Base ancestor;
Group child;
child->setAncestor(&ancestor)

Элемент данных Base::ancestor должен иметь защищенный доступ. Таким образом, он будет доступен для производных классов.

Другие вопросы по тегам