[英]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.