2012-04-18 4 views
0

Как я могу достичь privateMember без friend во всех производных классах?Дружба: много классов от одного и того же родителя

class parent{...}; //a virtual class 

class A: public parent{...}; 
class B: public parent{...}; 
class C: public parent{...}; 
class D: public parent{...}; 
class E: public parent{...}; 
... 
//each has a function, that want access to privateMember 

class MyClass{ 
    int privateMember; 

    friend parent; 
    //I know it doesnt't work, but this shows the best what I want 
} 

ответ

3

Оставить как есть (с friend class parent) и добавить функцию доступа к parent что A, B, ... будет использовать. Он будет защищен, поэтому функции извне иерархии не могут его использовать.

class parent { 
protected: 
    static int& getPrivate(MyClass & c) { return c.privateMember; } 
... 
}; 

Вы должны сделать это, потому что дружба не распространяется на производные классы.

+0

Я немного изменил функцию, чтобы она соответствовала описанию проблемы. –

+0

Хорошо, я понял, что это сработает. Я подумал, что есть более простой способ, и я могу это сделать без какой-либо функции setter и getter. Я так рад, почему C++ не поддерживает это по умолчанию. Но это намного лучше, чем ничего. Спасибо. – deeagle

0

Вы можете создать функцию геттер, что бы вернуть privateMember:

int getPrivateMember() const { return privateMEmber; }

Это должен быть публичный метод конечно.

0

Простой ответ здесь заключается в том, чтобы не уклоняться от внутреннего состояния других классов. Вместо этого используйте свой открытый API. Таким образом, вам никогда не придется беспокоиться о том, чтобы запереть себя в реализации, и вы избегаете широкого круга потенциальных проблем с непреднамеренным разрушением инвариантов класса при изменении переменной.

Смежные вопросы