2010-12-19 8 views
3

A::foo()B::bar()から次のサンプルに呼び出す良い方法はありますか?C++共通ベースクラスのプライベート/プロテクト機能を呼び出す

class A { 
protected: 
    void foo() {} 
}; 

class B : public A { 
public: 
    void bar(A& a) { // edit: called with &a != this 
    a.foo(); // does not work 
    } 
}; 

私はAの友人になるBを宣言する以外を考えることはできませんが、それはいくつかのより多くのクラスではかなり醜い得ることができます。

アイデア?

+0

なぜ 'B :: bar'は' A :: foo'を呼び出す必要がありますか? 'A :: foo'が保護されていると、それは' A'型のオブジェクトと 'A'から派生した型だけがそれを呼び出せなければならないことを意味するはずです。無関係なクラスから 'A :: foo'を本当に呼び出す必要があるのであれば、おそらく保護されるべきではありません。 –

+0

そして何が問題なのですか? –

+0

'B'が' A'の型であるときに 'B'に' A'インスタンスを渡す理由は何ですか? – birryree

答えて

4

のようにはい、あなたは基本クラスの機能を使用することができます:あなたはこのように行うことができます。

class A { 
protected: 
    void foo() {} 
    void do_other_foo(A& ref) { 
     ref.foo(); 
    } 
}; 

class B : public A { 
public: 
    void bar(A& a) { // edit: called with &a != this 
    this->do_other_foo(a); 
    } 
}; 
+0

です。本当にいいですが、おそらく最高の解決策です。ありがとう! –

3

なぜタイプAのオブジェクトを渡していますか?

class B : public A { 
public: 
    void bar() { 
    foo(); 
    } 
}; 

または、この

class B : public A { 
public: 
    void bar() { 
    A::foo(); 
    } 
}; 
+0

私は 'B :: bar'を' * this'ではなく、他のインスタンス(実際にはAの他のサブクラス上)で使うつもりでした。 –

+0

@lucas設計上の問題のようですね。 foo()はなぜ保護されていますか? –

+0

上記の私の記事を参照してください、私はそれを使用するために私の図書館の外にあるクラス/機能を望んでいません。 –

1

ここによって通話任意の派生クラスやオブジェクト許可、アクセスのように「保護」を与えるへのアプローチです。これは私の考えではありません

struct A 
{ 
protected: 
    //Zero sized struct which allows only derived classes to call privileged methods 
    struct DerivedOnlyAccessToken{}; 

public:  //public in the normal sense : 
    void foo() {} 

public:  //For derived types only : 
    void privilegedStuff(DerivedOnlyAccessToken aKey); 
}; 

struct B: A 
{ 
    void doPrivelegedStuff(A& a) 
    { 
     //Can create a token here 
     a.privilegedStuff(DerivedOnlyAccessToken()); 
    } 
}; 

int _tmain(int argc, _TCHAR* argv[]) 
{ 

    A a; 
    a.foo(); 
    a.privilegedStuff(A::DerivedOnlyAccessToken()); // compile error. 

    B b; 
    b.doPrivelegedStuff(a); 

    return 0; 
} 

: それは特権メソッドアンロックに必要な保護されたトークンタイプを使用しています。私はそれをいくつかの場所で読んだ。申し訳ありませんが、私はそれが狡猾なアイデアを思い出しません。

私はコンパイラがaKeyパラメータを削除できると期待しています。

+0

非常に良いアイデア、ありがとう! –

関連する問題