在函数调用中创建的对象与传入的对象之间有什么区别

mar*_*rcp 1 c++ wxwidgets c++11

这显然是我自学计算机科学教育的一个漏洞......

wxWidgets应用程序中文本控件(wxTextCtrl)的构造函数具有验证器对象的可选参数.所有代码示例都在文本控件的构造函数中动态创建验证器.

这有效..

wxString value = L"0.0";
wxTextCtrl* _Text = new wxTextCtrl(this, wxID_ANY, value, 
    wxDefaultPosition, wxDefaultSize, 0, 
    wxTextValidator(wxFILTER_NUMERIC, &value));
Run Code Online (Sandbox Code Playgroud)

但是在我的特殊情况下,我想在另一个函数中创建验证器并将其传回,这是行不通的.作为一个中间步骤,我试图在创建wxTextCtrl之前创建它并将其传递但是这也不起作用......

wxString value = L"0.0";
wxValidator valid = wxTextValidator(wxFILTER_NUMERIC, &value);
wxTextCtrl* _Text = new wxTextCtrl(this, wxID_ANY, value, 
    wxDefaultPosition, wxDefaultSize, 0, valid);
Run Code Online (Sandbox Code Playgroud)

虽然这编译并运行但它不执行验证.有谁能解释为什么?

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 
)
Run Code Online (Sandbox Code Playgroud)

Tav*_*nes 6

当您将对象分配给类型的变量(即其基类)时,您已对该对象进行了切片.要解决此问题,您需要保留更具体的类型:wxTextValidatorwxValidator

wxTextValidator valid = wxTextValidator(wxFILTER_NUMERIC, &value);
Run Code Online (Sandbox Code Playgroud)

您可以使用auto以避免重复自己.

或者,您可以使用在为引用分配临时值时发生的生命周期扩展const:

const wxValidator& valid = wxTextValidator(wxFILTER_NUMERIC, &value);
Run Code Online (Sandbox Code Playgroud)

这是有效的,因为没有副本,因此没有切片.

请注意,在设计自己的类时,通过使基类抽象或制作(复制)构造函数来防止对象切片通常是个好主意protected.