0

我有一些 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?

4

4 回答 4

2

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

对于可空对象类型,您可以使用Boost.Optional,或实现您自己的可空包装类。有谈论optional被包含在未来的标准库中;但就目前而言,您需要 Boost。

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

于 2013-04-05T13:40:35.707 回答
1

这就是我将如何改变你的用法:

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

RecursiveDescentParser *parser = new RecursiveDescentParser(stream);
于 2013-04-05T13:44:56.747 回答
0

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

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

于 2013-04-05T13:37:50.317 回答
0

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

据我了解,您正在为 RecursiveDescentParser 创建一个构造函数。构造函数的工作是初始化对象。

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

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

虽然,我可以完全离开,但这只是一个建议,我欢迎所有关于为什么这不起作用的建设性批评。

于 2013-04-05T13:44:26.263 回答