J'ai rencontré le problème suivant et je ne sais pas vraiment quelle est la meilleure façon d'aborder cela. Je veux évaluer expression
objets qui sont construits avec un objet foo
. La classe expression
et ses classes dérivées doivent pouvoir accéder aux membres privés de foo; mais excepté de déclarer toutes les classes dérivées individuellement comme ami je ne sais pas comment je pourrais faire ce travail - puis-je déclarer une fonction virtuelle un ami de foo
?Statut d'ami pour les classes dérivées de classe purement virtuelle
class foo{
public:
foo(int a, int b, int c) : a(a), b(b), c(c) {}
void addExpression(expression *e){exp.push_back(e);}
bool evaluateAll(){
for(expression* e : exp){
if(!e->evaluate())
return false;
}
return true;
}
private:
int a,b,c;
std::list<expression*> exp;
};
Les expression
classes:
struct expression{
expression(foo *f) : f(f) {}
virtual bool evaluate() = 0;
private:
foo *f;
};
struct anExpression : public expression{
anExpression(foo *f) : expression(f) {}
bool evaluate(){
return f->a < f->b;
}
};
struct anotherExpression : public expression{
anotherExpression(foo *f) : expression(f) {}
bool evaluate(){
return f->a > f->b && f->a != f->c;
}
};
La fonction main
:
int main(int argc, char *argv[]){
foo f(3,2,1);
f.addExpression(new anExpression(&f));
f.addExpression(new anotherExpression(&f));
f.evaluateAll();
return 0;
}
Ce code ne fonctionne pas bien sûr, mais je ne veux vraiment pas ajouter chaque classe dérivée de expression
en tant qu'ami ou marque expression
hériter de foo
. Y a-t-il une autre solution?
L'utilisation d'une fonction get? – Jonas
Oui cela fonctionnerait - je pourrais également rendre tous les membres publics mais ce n'est pas le point. D'une certaine manière, je veux que l'objet 'foo' prenne possession des objets' expression' et je ne veux pas exposer les membres de 'foo' directement ou par l'intermédiaire de get-functions. –
Vous pourriez rendre 'expression' une classe d'amis de' foo', et implémenter get-functions dans 'expression'. – Jonas