【问题标题】:ostream operator << not executingostream 运算符 << 未执行
【发布时间】:2012-02-02 20:16:51
【问题描述】:

所以我有这段代码是我自己编写的,但取自其他示例代码......

class A{
    friend std::ostream& operator<< (std::ostream& out, A& a);
    // Constructors, destructor, and variables have been declared
    // and initialized and all good.
}

std::ostream& operator<< (std::ostream& out, A& a){
    out << " this gets written " << endl; // it doesn't get executed
    return out;
}

int main(){
    A *_a = new A();
    return 0;
}

好吧,这只是不在控制台中打印" this gets written "

【问题讨论】:

  • 你的代码没有意义。您的&lt;&lt; 运算符接受AccountInfo&amp; 类型的参数,而不是A*,您甚至没有向我们展示您实际尝试使用该运算符的部分。您省略了太多代码,剩下的代码对调试您的问题毫无用处。
  • 使用?我认为这是一种自动的,就像创建对象时一样。另外 AccountInfo 类型是错误的,我现在修复它。
  • “使用”是指“向我们展示您如何尝试将对象写入流”。您不能只声明操作员并期望它做某事,您必须实际调用它。你期望上面的代码做什么?您发布的唯一代码A *_a = new A();&lt;&lt; 运算符或流无关。它只是创建一个新的A 然后退出。
  • 嗯,我在类中有friend std::ostream&amp; operator&lt;&lt; (std::ostream&amp; out, A&amp; a);,我认为每次创建新对象或类似的东西时都会将它写入控制台。
  • 我认为是时候使用good book on C++了!

标签: c++ operator-keyword ostream


【解决方案1】:

如果您尝试通过std::cout &lt;&lt; a 或类似的方式使用运算符,问题是您将指针 传递给对象,而&lt;&lt; 运算符被定义为采用一个对象的引用。您要么需要将a 声明为常规(非指针)A,要么使用std::cout &lt;&lt; *a

【讨论】:

  • 我应该在哪里使用 std::cout &lt;&lt; *a 以便每次创建新的 A 对象时都会写入它并打印它?
  • 在类的构造函数中。你会写像std::cout &lt;&lt; *this这样的东西。
  • 还有@meagar,每当我将a 设置为常规A 并使用std::cout &lt;&lt; *a 时,我总是会得到地址。不打印地址的唯一情况是我不更改 a 的类型并使用 std::cout &lt;&lt; *a
  • @Yokhen :如果你实例化一个普通的A 与一个A*std::cout &lt;&lt; *a 不会编译;正确的语法是std::cout &lt;&lt; a
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-12-16
  • 1970-01-01
  • 1970-01-01
  • 2017-04-13
  • 2013-10-10
  • 2018-03-31
  • 1970-01-01
相关资源
最近更新 更多