【问题标题】:Default ofstream class argument in function函数中的默认 ofstream 类参数
【发布时间】:2013-10-19 18:22:14
【问题描述】:

我有功能。如果用户没有在这个函数中提供ofstream 元素:

bool isPolpierwsza(int, bool = false, ofstream = NULL);

比我想分配“plik”

bool isPolpierwsza(int liczba, bool wypisz, ofstream plik)

NULL值。

我的编译器出错:

2.9.cpp:5:48: 错误:无法从“long”转换为“ofstream”(又名“basic_ofstream”)
bool isPolpierwsza(int, bool = false, ofstream = NULL);

如何设置 ofstream 的默认值被视为NULL 或“false”?

【问题讨论】:

  • 这和C#有什么关系?
  • 用不同的函数重载它。毕竟是 C++。所以提供两个版本;一个没有流的(首先应该是一个参考)。
  • ofstream 不是指针。您不能将其设置为NULLNULL 宏很可能被定义为 0L,因此出现此错误。
  • 一般没有“空值”这样的东西。一些类型(例如指针或可选类型)有这样的概念,但大多数类型没有。

标签: c++ arguments


【解决方案1】:

您可以使用两个重载,其中一个采用std::ofstream 参数:

bool isPolpierwsza(int liczba, bool wypisz)
{
    return isPolpierwsza(liczba, wypisz, /* your own argument */);
}

【讨论】:

  • 如果wypisz=false 的意图不是写任何东西,你会为your own argument 使用什么?与NULL“类似”的东西似乎是正确的......
  • 是的,您只需将NULL 作为第三个参数传递
  • 但我认为NULL 不能用于ofstream
  • @sancho.sReinstateMonicaCellio 将 ofstream 参数更改为指针。 (ofstream*)。
  • @sancho.sReinstateMonicaCellio 然后使用 if 语句检查 ofstream 是否有效:if (wypisz) { ... }。然后你像 (*stream) 一样取消引用它以便使用它。
【解决方案2】:

您可以改为传递流缓冲区:

bool isPolpierwsza(int, bool = false, std::streambuf* osbuf = nullptr)
{
    std::ostream os(osbuf? osbuf : std::cout.rdbuf());
    os << "yay it works\n";
    return false;
}

现在,这样称呼它:

std::ofstream ofs("myoutput.txt");
bool result = isPolpierwsza(42, true, ofs.rdbuf());

或者实际上,没有参数。

【讨论】:

  • @0x499602D2 嗯,这感觉更像是 IOStream 库设计的精神(我知道,这伤害了很多人的眼睛)
【解决方案3】:

首先,使用 ostream 代替 ofstream 可能会很有用,因为这更通用,被认为是更好的做法。

然后,您可以简单地分配“cout”而不是“NULL”。 NULL 不起作用,因为 ostream 不是指针而是结构。这意味着结构必须完全填写并且不能分配为NULL。相反,您可以使用 cout,例如

bool isPolpierwsza(int, bool = false, ostream& = cout);

【讨论】:

  • 这甚至不会编译。流不能按值公开复制。最后一个参数需要作为参考。
  • 这会将内容打印到标准输出;我猜 OP 根本不想打印东西!
猜你喜欢
  • 1970-01-01
  • 2017-11-21
  • 2013-04-15
  • 2014-07-25
  • 1970-01-01
  • 2011-01-30
  • 1970-01-01
  • 1970-01-01
  • 2011-02-20
相关资源
最近更新 更多