簡體   English   中英

C ++中字符串和ofstream參數的類Java null

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

我有一些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 ,或實現自己的可為空的包裝器類。 據說將來的標准庫中將包含optional 但就目前而言,您需要使用Boost。

或者,提供第二個完全不接受這些參數的構造函數可能更有意義。

這就是我將如何更改您的用法:

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

RecursiveDescentParser *parser = new RecursiveDescentParser(stream);

您有兩個選擇-創建代表可選值的包裝器類或使用指針。 我強烈建議第一種選擇。

同樣在某些情況下,您可能會認為空字符串等效於未設置的值。

可悲的是,C ++中的字符串是對象,並且與Java不同,C ++對象不能為null。

據我了解,您正在創建RecursiveDescentParser的構造函數。 構造函數的工作是初始化對象。

如果允許構造函數接受指針,則它可以接受空路徑字符串,那么它將使用空路徑字符串創建,因為構造函數的工作是初始化所有字段,並且不初始化空字段,因此並不是一個好的解決方案。

我的建議是將構造函數設為私有,但創建一個公共方法,該方法可以接受構造函數將要使用的參數,但也可以是指向字符串而不是對象的指針。 如果路徑字符串指針為null,則引發異常或返回錯誤對象。 如果路徑字符串有效,請從對路徑字符串指針指向的字符串的引用創建一個新的解析器,然后返回該引用。

雖然,我可能會完全不滿意,但這只是一個建議,我歡迎所有關於為何無效的建設性批評。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM