这显然是我自学计算机科学教育的一个漏洞......
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
)
答案 0 :(得分:6)
当您将wxTextValidator
对象分配给其基类类型wxValidator
的变量时,您有sliced个对象。要解决此问题,您需要保留更具体的类型:
wxTextValidator valid = wxTextValidator(wxFILTER_NUMERIC, &value);
您可以使用auto
来避免重复自己。
或者,您可以使用lifetime extension在将临时值分配给const
引用时发生:
const wxValidator& valid = wxTextValidator(wxFILTER_NUMERIC, &value);
这是有效的,因为没有副本,因此没有切片。
请注意,在设计自己的类时,通过使基类抽象或制作(复制)构造函数protected
来防止对象切片通常是一个好主意。