0

フレンドクラスからメンバー関数にアクセスする方法はありますか?

// foo.h

template<typename T>
class A
{
    bool operator()(Item* item)
    {
        ObjectClass c = get_class_from_item(item); // compiler error
        ...
    }
};

class B
{
    ...
    template<typename T> friend class A;
    ...
    ObjectClass get_class_from_item(Item* item);
};

重要な場合はgcc4.5.2を使用します

4

2 に答える 2

3

get_class_from_itemある種のファクトリー関数であると思われる場合は、静的にする必要があります。get_class_from_itemコンパイラがクラスで指定された関数を探しているため、エラーが発生しますABスコープ内になく、クラスのインスタンスがないため、関数が表示されることはありませんB。ウィキペディアに関するもう少し説明があります:http://en.wikipedia.org/wiki/Factory_function

これはそれを行う必要があります:

class A
{
    bool operator()(Item * item)
    {
        ObjectClass c = B::get_class_from_item(item);
        ...
    }
};

class B
{
    static ObjectClass get_class_from_item(Item* item);
};

Aまた、友達クラスになる必要がある理由はありBますか?それとも、仕事に取り掛かろうとしてそれをしたget_class_from_itemのですか?のいくつかAのプライベート要素にアクセスできる必要がありますBか?これについて慎重に考えてください。ほとんどの場合、を使用してすべてのカプセル化を破棄するのではなく、必要なものを取得するためのより良い方法がありますfriend

[編集]コード例から行を削除して、最小限に抑えました。

于 2011-04-01T08:32:57.260 に答える
2

いいえ、はメンバー関数なので、それを呼び出すにget_class_from_itemはクラスのインスタンスが必要です。B

于 2011-04-01T08:33:57.743 に答える