C++从友元类访问成员函数

发布于 2024-10-30 04:33:03 字数 378 浏览 6 评论 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);
};

如果重要的话我使用 gcc 4.5.2

Is there a way to access member-function from the 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);
};

If it matters I use gcc 4.5.2

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

妥活 2024-11-06 04:33:03

如果 get_class_from_item 应该是某种工厂函数(看起来确实如此),那么您需要将其设为静态。您收到此错误是因为您的编译器正在类 A 中查找名为 get_class_from_item 的函数。它永远不会在 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 扔掉所有封装。

[编辑] 从代码示例中删除了几行,以将其精简到最低限度。

If get_class_from_item is supposed to be some kind of Factory function, which it seems to be, you need to make it static. You get the error because your compiler is looking for a function named get_class_from_item in class A. It will never see the function in B because it is not in the scope and you don't have an instance of class B. Here is some more explanation on Wikipedia: http://en.wikipedia.org/wiki/Factory_function.

This should do it:

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

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

Also, is there a reason that A needs to be a friend class of B? Or did you just do that trying to get get_class_from_itemto work? Does A need to be able to access some private elements of B? Think carefully about this, most of the time there are better ways of obtaining what you want instead of throwing away all encapsulation by using friend.

[Edit] Removed lines from code example to strip it to the bare minimum.

幻想少年梦 2024-11-06 04:33:03

不,由于 get_class_from_item 是一个成员函数,因此您需要类 B 的实例才能调用它。

No, since get_class_from_item is a member function you need an instance of class B to call it.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文