C++ 重载运算符<<

Posted

技术标签:

【中文标题】C++ 重载运算符<<【英文标题】:C++ overloading operator<< 【发布时间】:2012-06-02 12:53:17 【问题描述】:

我正在尝试为类重载 NumExpr 类,并且有我想要输出的私有变量number。所以他们在这里:

NumExpr::NumExpr( string n ) 
    number = atoi( n.c_str() );

string NumExpr::name() 
    return "num";

ostream & operator<<(ostream &s, const NumExpr &num) 
    s << num.number;
    return s;

我将它设为友元函数,以便它可以访问私有变量

class NumExpr : public Expr 
    public:
        NumExpr( string v );
        string name();
    private:
        int number;
        friend ostream& operator<<(ostream &s, const NumExpr &num);
;

但是我得到了这个错误

./ast/Expr.cpp: 在函数 ?std::ostream& 运算符

我已经搜索过这个错误,人们似乎遇到了同样的问题,但我的似乎看起来像是人们给出的解决方案。是我在做一些根本性的错误,还是我不知道有一些语法恶作剧?

感谢您的帮助!

【问题讨论】:

This works fine 只要您使用正确的构造函数创建对象NumExpr 它编译:ideone.com/aZTvQ。你能告诉我们调用代码吗? 有趣!我还没有添加函数的调用代码。它只是新制作的并且有问题而无需我打电话给它。顺便说一句,如果有帮助的话,我在 linux 上使用 g++ 命令。 @Naveen 嗯,这看起来像是我将如何实例化课程,不知道为什么它在我这边不起作用。 【参考方案1】:

好的,到这里了,我可以玩一点reproduce your problem

问题是您忘记包含 iostream 头文件。 添加:

#include<iostream>

它应该可以正常工作:)

编辑: 正如@James Kanze 在 cmets 中正确建议的那样,包含

#include<istream>

因为您真的不需要iostream 中的所有内容。 在istream 中包含iostream 的缺点是编译时间几乎没有增加。

【讨论】:

哇,那是.....哇。我想知道为什么 int 有问题,但我想我又想多了。 哦,不包括致命的标题!谢谢:) 附带说明如果有人知道(不想开始另一个问题)如果我调用派生类中的重载运算符,它有一个指针,该指针最初是指向基类的指针,它重载它会调用函数吗?即类似:NumExpr* numexpr = new NumExpr; FExpr* expr = numexpr; cout &lt;&lt; expr; @JasonHu:在这种情况下,如果你这样做了cout &lt;&lt; *expr;,你最终会得到一个编译错误,你没有重载&lt;&lt;forExpr类,所以编译器会尝试搜索适当的使用cout 重载并且将失败,因为Expr 是您的自定义数据类型。如果你做了一个cout &lt;&lt; expr; 它会打印指针的地址,我相信这不是你想要的。 有其他方法可以解决这个问题吗?我来自java背景,可以重载被interited的toString()方法【参考方案2】:

在这个页面上:

http://www.cplusplus.com/forum/beginner/13164/

它说有这样的朋友功能:

friend std::ostream& operator<< (std::ostream&, const NumExpr&); <- 

所以没有变量减速。只是

const NumExpr

有什么帮助吗?

【讨论】:

原型可能包含也可能不包含参数的实际名称。如果是,则忽略该名称。 抱歉伙计们,我看不出与示例有任何其他差异。

以上是关于C++ 重载运算符<<的主要内容,如果未能解决你的问题,请参考以下文章

C++ 运算符重载

在 C++ 中重载运算符 < [重复]

C++ Complex + - += -+ <<运算符重载

在 C++ 中调用成员的重载 << 运算符

C++:使用类|| 运算符重载友元

C++ 输入/输出运算符重载