我遇到了以下问题,我不知道最好的解决方法是什么。我想评估使用foo
对象构建的对象expression
。应允许expression
类及其派生类访问foo的私有成员;但除了将所有派生类单独声明为朋友之外,我不知道如何才能完成这项工作 - 我可以声明一个虚拟函数foo
的朋友吗?纯虚拟类的派生类的朋友状态
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;
};
的expression
类:
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;
}
};
的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;
}
此代码不能当然的工作,但我真的不希望添加每一个派生类的作为朋友的expression
或从foo
继承expression
。还有其他解决方案吗?
使用获取函数? – Jonas
是的,这将工作 - 我也可以让所有的成员公开,但这不是重点。在某种程度上,我希望'foo'对象拥有'expression'对象,并且我不想直接或通过get函数暴露'foo'的成员。 –
你可以使'expression'成为'foo'的一个好友类,并在'expression'中实现get-function。 – Jonas