c++中string和ofstream参数的null类似java

Java-like null for string and ofstream arguments in c++

本文关键字:null 类似 java 参数 ofstream string c++      更新时间:2023-10-16

我有一些Java代码(构造函数)

RecursiveDescentParser
(
  std::string inputStream, 
  bool fileService, 
  std::string filePathName, 
  std::ofstream writer
)
{
  input_ = inputStream;
  tokenizer_ = new Tokenizer(inputStream);
  if (fileService == true){
      error = new ErrorHandling(fileService, std::move(writer));
  }
  else{
      error = new ErrorHandling(fileService, std::ofstream());
  }     
  compiled_ = "";
}
Tokenizer *tokenizer_;
std::string input_, compiled_;

我想模拟c++中的调用

RecursiveDescentParser *parser = new RecursiveDescentParser
(
  stream, 
  false, 
  null, 
  null
);

如果我使用指针参数

std::string *str; std::ofstream *out

我可以传入nullptr,但如果我选择不使用指针参数,我就不能传入null。我能做些什么来模拟传递null给std::string和std::ofstream?

指针是一种选择;但这会造成复杂性,因为您需要单独管理对象或使用智能指针。共享指针是一种可能,并且提供与Java的对象引用非常相似的语义(只是引用计数而不是垃圾收集)。

对于可空对象类型,可以使用Boost。可选,或者实现您自己的可空包装器类。有传言说optional将被包含在未来的标准库中;但是现在,你需要Boost来实现。

或者,提供第二个根本不接受这些参数的构造函数可能更有意义。

我将如何改变你的用法:

RecursiveDescentParser
(
  std::string inputStream, 
  bool fileService = false, 
  std::string filePathName = "", 
  std::ofstream* writer = NULL
)
RecursiveDescentParser *parser = new RecursiveDescentParser(stream);

您有两个选择—创建一个表示可选值的包装器类或使用指针。我强烈推荐第一种选择。

在某些情况下,您可能会认为空字符串等同于未设置值。

遗憾的是,c++中的字符串是对象,与java不同,c++对象不能为空。

从我的理解,你正在创建一个构造器递归的descentparser。构造函数的任务是初始化对象。

如果允许构造函数接受指针,它可以接受空路径字符串,那么它将被创建为空路径字符串,因为它的构造函数的工作是初始化所有字段,而空字段没有初始化,这将不是一个好的解决方案。

我的建议是将构造函数设为私有,但创建一个可以接受构造函数的参数的公共方法,但也要有一个指向字符串而不是对象的指针。如果路径字符串指针为空,则抛出异常或返回错误对象。如果路径字符串是有效的,创建一个新的解析器,从引用到路径字符串指针所指向的字符串,并返回这个引用。

虽然,我可以完全关闭,但这只是一个建议,我欢迎所有建设性的批评,为什么这不会工作