【问题标题】:Can I print an object of the class using printf()?我可以使用 printf() 打印类的对象吗?
【发布时间】:2016-02-15 16:28:53
【问题描述】:

我有一些这样的代码:

class Point {
public:
    int x,y;
    Point() : x(1), y(1) {}
}

我可以使用printf() 打印该类的对象吗:

int main()
{
    Point point;
    printf("%o",point);
    return 0;
}

或者我必须重载operator<< 并使用std::cout

std::ostream& operator<<(std::ostream& os, Point const& p)
{
    os << p.x << "," << p.y;
    return os;
}
int main()
{
    Point point;
    std::cout << point;
    return 0;
}

【问题讨论】:

  • 请去掉c标签。
  • @IanAbbott 你来了!
  • 当你尝试printf时发生了什么?
  • @juanchopanza 编译已停止,因为表达式 "%o" 无效。当我尝试一个有效的参数时,比如"%d",出现了一个错误expects argument of type int
  • 这就是你的问题的答案。

标签: c++ printf cout


【解决方案1】:

我可以使用printf() 打印该类的对象吗?

没有。 printf 在这个意义上是不可扩展的。

您最好的选择是在std::ostreamPoint 之间重载operator&lt;&lt;

PS我建议将参数类型更改为Point const&amp;

【讨论】:

    【解决方案2】:

    但是,您可以在您的类中使用自定义 print 函数,它会以您想要的方式打印您的对象:

    ...
    void print() const {
      printf("[%d, %d]", x, y);
    }
    ...
    
    int main()
    {
      Point point;
      point.print();
      return 0;
    }
    

    如果您愿意,您还可以使用fprintf 和自定义流。这不完全是您问题的答案,但在所描述的情况下似乎很有用。

    【讨论】:

    • 确实如此,但我猜使用std::cout 更“自然”。
    • @Nathiss,这取决于。例如,谷歌样式表禁止使用流,实际上鼓励使用fprintfUPD: 呃.. 哦......不再是了。现在他们稍微不鼓励使用它们,但不再禁止了。
    【解决方案3】:

    您必须重载运算符,否则printf() 将混淆对象point 的打印内容,因为该类有两个成员。

    【讨论】:

    • 或者你可以声明另一个可以打印成员值的getter() 函数。
    • 如何为该类重载printf() 函数?
    • printf() 本身看起来像重载。因为,在这里你可以拥有printf("%d", aDec)printf("%f", aFloat)。这看起来很像函数重载,因为我们使用相同的函数名,但函数接受不同的参数类型——这是我们重载函数的方法之一。但是对于这门课,我建议你做重载
    • 据我所知,printf() 是 C 函数。在标准 C 中,我们不能重载任何函数。我们可以打印intfloat 变量,因为在函数printf() 中没有指定参数列表。因此printf() 可以打印任何基本类型(int、float、double、char、bool),但不能打印用户指定的类型。
    猜你喜欢
    • 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
    相关资源
    最近更新 更多