繁体   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