www.digitalmars.com         C & C++   DMDScript  

digitalmars.D.learn - Friends access to an arbitrary class?

reply Ald <aldarri_s yahoo.com> writes:
Suppose I have a hierarchy of classes, with base class Human.
Each Human has a reference to a class of (super) type Algorithm, which contains
the implementation of the Human's behavior.

How can I give every Algorithm (and derivative) access to every private method
and member to any Human (or derivative) that holds reference to that Algorithm?

I tried inheriting from nested classes and from classes in the same module.
Jul 08 2007
parent Bill Baxter <dnewsgroup billbaxter.com> writes:
Ald wrote:
 Suppose I have a hierarchy of classes, with base class Human.
 Each Human has a reference to a class of (super) type Algorithm, which
contains the implementation of the Human's behavior.
 
 How can I give every Algorithm (and derivative) access to every private method
and member to any Human (or derivative) that holds reference to that Algorithm?
 
 I tried inheriting from nested classes and from classes in the same module.
Being in the same module (i.e. same file) should work. If FunkyHuman and CoolAlgorithm are in the same module CoolAlgorithm can access anything in FunkyHuman. Are you saying you tried that and it didn't work? Anyway, you might be barking up the wrong tree. Having a member that knows how to manipulate every private attribute of it's owner sounds to me more like a use case for a mixin. I.e. reuse Algorithms by making them an actual part of the classes you want them to act on. template CoolAlgorithm() { void act_cool() { mode = COOL; } } class FunkyHuman { mixin CoolAlgorithm; // FunkyHuman now has an act_cool() method private: int mode = UNCOOL; } You might even be able to make the mixin an alias template parameter so you can create FunkyHumans with different algorithms (don't recall if that works actually...) class FunkyHuman(alias AlgoMixin) { mixin AlgoMixin; ... } If you need to unplug and replace Algorithms at runtime, then it seems like you need to reconsider whether the parts of Human they need access to are really private. If external objects need to access it, then it sounds more like it's part of the public interface. --bb
Jul 08 2007