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 << expr;
@JasonHu:在这种情况下,如果你这样做了cout << *expr;
,你最终会得到一个编译错误,你没有重载<<
forExpr
类,所以编译器会尝试搜索适当的使用cout
重载并且将失败,因为Expr
是您的自定义数据类型。如果你做了一个cout << expr;
它会打印指针的地址,我相信这不是你想要的。
有其他方法可以解决这个问题吗?我来自java背景,可以重载被interited的toString()方法【参考方案2】:
在这个页面上:
http://www.cplusplus.com/forum/beginner/13164/
它说有这样的朋友功能:
friend std::ostream& operator<< (std::ostream&, const NumExpr&); <-
所以没有变量减速。只是
const NumExpr
有什么帮助吗?
【讨论】:
原型可能包含也可能不包含参数的实际名称。如果是,则忽略该名称。 抱歉伙计们,我看不出与示例有任何其他差异。以上是关于C++ 重载运算符<<的主要内容,如果未能解决你的问题,请参考以下文章