[英]What's difference between Object obj = Object() and Object obj()?
[英]What's the difference between an object created in function call and object passed in
這顯然是我自學計算機科學教育的一個漏洞。
wxWidgets應用程序中的文本控件(wxTextCtrl)的構造函數具有一個用於驗證器對象的可選參數。 所有代碼示例都在文本控件的構造函數中動態創建驗證器。
這有效..
wxString value = L"0.0";
wxTextCtrl* _Text = new wxTextCtrl(this, wxID_ANY, value,
wxDefaultPosition, wxDefaultSize, 0,
wxTextValidator(wxFILTER_NUMERIC, &value));
但是,在我的特定情況下,我想在另一個函數中創建驗證器並將其傳遞回去,這是行不通的。 作為一個中間步驟,我嘗試在創建wxTextCtrl並將其傳遞之前創建它,但這也不起作用...
wxString value = L"0.0";
wxValidator valid = wxTextValidator(wxFILTER_NUMERIC, &value);
wxTextCtrl* _Text = new wxTextCtrl(this, wxID_ANY, value,
wxDefaultPosition, wxDefaultSize, 0, valid);
盡管這會編譯並運行,但不會執行驗證。 誰能解釋為什么?
wxTextValidator的原型需要一個常量引用。
wxTextCtrl::wxTextCtrl ( wxWindow * parent,
wxWindowID id,
const wxString & value = wxEmptyString,
const wxPoint & pos = wxDefaultPosition,
const wxSize & size = wxDefaultSize,
long style = 0,
const wxValidator & validator = wxDefaultValidator,
const wxString & name = wxTextCtrlNameStr
)
將wxTextValidator
對象分配給其基類wxValidator
類型的變量時,已對它進行了切片 。 要解決此問題,您需要保留更具體的類型:
wxTextValidator valid = wxTextValidator(wxFILTER_NUMERIC, &value);
您可以使用auto
來避免重復自己。
另外,您可以使用生命周期擴展 ,這是在將臨時const
分配給const
引用時發生的:
const wxValidator& valid = wxTextValidator(wxFILTER_NUMERIC, &value);
之所以有效,是因為沒有副本,因此也沒有切片。
請注意,在設計自己的類時,通過使基類抽象化或使它們的(副本)構造函數protected
來防止對象切片通常是一個好主意。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.