【问题标题】:What's the difference between an object created in function call and object passed in函数调用中创建的对象和传入的对象有什么区别
【发布时间】:2017-03-07 19:08:09
【问题描述】:

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

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 
)

【问题讨论】:

  • new wxTextCtrl() 调用的第三个参数不同:value_controls[name]。这是故意的吗?
  • @TavianBarnes 不,这是一个错字,我已经修正了。

标签: c++ c++11 wxwidgets


【解决方案1】:

当您将 wxTextValidator 对象分配给其基类 wxValidator 类型的变量时,您拥有 sliced 对象。要解决此问题,您需要保留更具体的类型:

wxTextValidator valid = wxTextValidator(wxFILTER_NUMERIC, &value);

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

或者,您可以使用lifetime extension,它在将临时分配给const 引用时发生:

const wxValidator& valid = wxTextValidator(wxFILTER_NUMERIC, &value);

这是可行的,因为没有副本,因此没有切片。

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

【讨论】:

  • 修复可能是:wxTextValidator valid{wxFILTER_NUMERIC, &value};auto valid = wxTextValidator(wxFILTER_NUMERIC, &value);(这两者都意味着您可以避免以可能意外不同步的方式重复自己)。
  • @ShadowRanger 确实如此。即使const wxValidator& valid = ... 也会因为生命周期延长而工作。
  • @TavianBarns 我将(显然)需要阅读更多内容,但这不正是工作示例中正在发生的事情吗?
  • @marcp 是的。
  • @ShadowRanger,我不明白你第一个建议的语法。那叫什么?
猜你喜欢
  • 2010-10-28
  • 2017-03-31
  • 2021-10-25
  • 1970-01-01
  • 1970-01-01
  • 2018-09-09
  • 2011-09-23
  • 2013-06-26
相关资源
最近更新 更多