2017-07-28 226 views
0

我遇到了以下问题,我不知道最好的解决方法是什么。我想评估使用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。还有其他解决方案吗?

+1

使用获取函数? – Jonas

+0

是的,这将工作 - 我也可以让所有的成员公开,但这不是重点。在某种程度上,我希望'foo'对象拥有'expression'对象,并且我不想直接或通过get函数暴露'foo'的成员。 –

+0

你可以使'expression'成为'foo'的一个好友类,并在'expression'中实现get-function。 – Jonas

回答

0

我会做expression朋友类foo,即,添加以下为foo:

friend struct expression; 

,然后实现获得-功能expression,像这样:

struct expression { 
// other stuff 

protected: 
    int get_a(foo const * f) { return f->a; } 
} 

的获取函数应该标记为protected以减少暴露。获得函数的参数是const,这是一个很好的衡量标准。

+0

为什么不简单地使用'foo :: get_a()'? – user463035818

+0

@ tobi303只是因为OP不喜欢它......因为它暴露了foo的一些成员。但是,是的,这似乎是快速解决方案。 – Jonas

+0

啊对不起,没有看到'foo :: get'不是一个选项的评论 – user463035818