【问题标题】:Overloaded << Operator Printing Address重载 << 运算符打印地址
【发布时间】:2012-04-15 02:06:13
【问题描述】:

致反对者:我知道这是一个结构不佳的问题。如果您向下滚动到答案,您会发现我发现了问题的根源。虽然这个问题本身可能没有帮助,但我希望答案能帮助遇到类似运算符重载问题的人。问题是它是什么;我无法确定任何可以使这个问题变得更好的编辑或修订。因此,如果您要投反对票,请同时添加建设性评论。谢谢。


我正在运行以下代码

myObject o = myObject();
cout << o << endl;

我的 (friend)

ostream& operator << (ostream& s, myObject o)
{
    s << doStuff(o, s) << endl;
    return s;
}

预期输出:

object contents

由于某种原因,实际输出包括内存地址:

5452ED48object contents

为什么?

【问题讨论】:

  • 什么是doStuff()?顺便一提。敲掉所有“myObject o = myObject();”商业。 “我的对象 o;”足够了。
  • @BenjaminLindley:如果myObject 是 POD,myObject o 可能还不够。
  • 信息不足,投票结束。
  • .doStuff() 是一个遍历树的递归函数。我认为这无关紧要,因为在我添加方法之前就出现了错误。我认为我的问题可能有一个更通用的解决方案。也许我错了。我会尽快进行编辑。

标签: c++ debugging console operator-overloading ostream


【解决方案1】:

我们无法理解你想做什么......我理解的是这样的:

#include <iostream>
using namespace std;

class obj{

    friend ostream&operator<<(ostream &out, const obj o);
public:
    obj(int a);
    int change_data();
private: 
    int s;
    int d;

};

obj::obj(int a)
{
    s = a;
    d = s;
}

int obj::change_data()
{
    return 99;
}

ostream&operator<<(ostream &out, const obj o){
    out << o.s;
    out << " ";
    out << o.d;
}

int main(int argc, char **argv) {
    obj some(1);
    cout << some;
    return 0;
}

输出:

1 1

您似乎必须了解通过引用传递值,因为当您使用“

【讨论】:

    【解决方案2】:

    很抱歉没有提供足够的细节。原来我应该这样做:

    doStuff(o, s);
    return s;
    

    显然我将所需的输出附加到 s,其中已经包含地址。

    【讨论】:

      猜你喜欢
      • 2013-02-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-17
      • 1970-01-01
      相关资源
      最近更新 更多