簡體   English   中英

在函數調用中創建的對象與傳入的對象之間有什么區別

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

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