来自友元类的C ++访问成员函数

时间:2011-04-01 08:30:08

标签: c++ friend friend-class

有没有办法从朋友类访问成员函数?

// 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);
};

如果重要,我使用gcc 4.5.2

2 个答案:

答案 0 :(得分:3)

如果get_class_from_item应该是某种类似的Factory函数,那么你需要将它设置为静态。您收到错误是因为您的编译器正在类get_class_from_item中查找名为A的函数。它永远不会在B中看到该函数,因为它不在范围内,并且您没有类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丢弃所有的封装。

[编辑] 从代码示例中删除了一行以将其剥离到最低限度。

答案 1 :(得分:2)

不,因为get_class_from_item是一个成员函数,你需要一个类B的实例来调用它。