【问题标题】:is there a way to overload extraction operator , inside a class and not as a friend of class?有没有办法在类中重载提取运算符而不是类的朋友?
【发布时间】:2012-04-17 11:03:59
【问题描述】:

我正在尝试重载

提前谢谢你

【问题讨论】:

  • 查看这个关于如何在类stackoverflow.com/a/2077010/597607中定义朋友的答案
  • 这有什么关系呢?我的意思是,既然没关系(我认为),这个问题是无用的(因此值得反对)。如果它很重要,那么了解它为什么重要会有所帮助,因为这样一来,人们就可以尝试以其他方式实际解决问题,而不是尝试以不可能的方式解决问题。
  • @R.MartinhoFernandes 我认为这是一个很好的问题,基本上他想以不直观的方式实现 ADL 所做的事情。这个问题有些晦涩难懂,很难表述清楚。
  • 老实说,我在这个问题上看不懂。如果是这样的话,我仍然认为OP需要说明这一点。
  • 具体来说,我认为他正在创建一个仅包含标头的库,并希望消除他认为是“用户”的 .cpp 组件。这也可以通过按所述定义朋友来实现,但将其设为inline……但是我的答案更好:v)

标签: c++ operator-overloading friend-function


【解决方案1】:

C++ 旨在允许非成员函数执行在其他语言中需要成员函数的事情。 friend 函数与成员函数非常相似,因为它可以在类范围内定义。此外(这可能会造成混淆)如果您在类范围内声明friend 函数only,则只能通过将该类的对象传递给它来访问它。

struct printme {
    friend std::ostream &operator<< ( std::ostream &os, printme const & )
        { return os << "hello"; }

    friend void named_friend( printme const & ) {}
};

std::cout << printme(); // OK
named_friend( printme() ); // OK
void (*fn_ptr) = named_friend; /* function not found
           it can only be found by association with printme */

虽然这个微妙的规则一开始很奇怪,但它反映了非成员函数也可以被类封装的想法。

如需了解更多信息,请阅读argument-dependent lookup (ADL)。

【讨论】:

    【解决方案2】:

    我们通常以如下方式使用

    cout<<myobject;
    

    如果你让 operator

    myobject<<cout;
    

    你想要这样吗?如果它适合你,你可以让它成为一个成员函数。

    如果你喜欢它

    cout<<myobject 
    

    - 你必须让 operator

    【讨论】:

    • 请在创建帖子时观察预览……然后按{} 按钮引用源代码。
    【解决方案3】:

    这是一个例子:

    #include <iostream>
    #include <string>
    
    using namespace std;
    
    class A {
    public:
        string pr() { return "Hi, I'm class A"; }
    };
    
    ostream &operator << (ostream &o, const A &a) {
        o << a.pr();
        return o;
    }
    
    int main() {
        A a;
    
        cout << a << endl;
    
        return 0;
    }
    

    但是,根据我的经验,不要那样做。超载在学术上很好,但它使搜索应用程序的实现变得困难,甚至无法理解 cout << myobject.tostring()

    形式的东西

    【讨论】:

    • 非常感谢 :) 我最近尝试使用 boost ,与此同时,我看到了很多这种重载,这让我的生活变得非常轻松,特别是在使用 boost::serialize 时,然后我想对我自己来说,我为什么不自己做这件事,让我的喜欢更容易? :) 是的,你是对的,我从来没有想过这个问题。我一定会记住这一点的:)再次谢谢你先生:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多