次の問題が発生しましたが、これに最も良い方法が何であるかはわかりません。 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
を友人にするかexpression
をfoo
から継承してください。別の解決策がありますか?
get-functionを使用しますか? – Jonas
はい、それはうまくいく - 私もすべてのメンバーを公開することができますが、それはポイントではありません。ある意味では、 'foo'オブジェクトが' expression'オブジェクトを所有することを望み、 'foo'のメンバーを直接またはget関数を介して公開したくありません。 –
'expression'を' foo'のfriendクラスにし、 'expression'にget-functionsを実装することができます。 – Jonas