C++,在 wxWidgets 中传递自定义 class 对象

C++, Passing custom class object in wxWidgets

有人可以向我解释如何将自定义 class 对象传递给 wxWidgets 中的另一个函数吗?我有一个名为 AddUser 的 wxDialog class,它包含一个 void 类型的 OnButtonClick 函数,它创建一个自定义 class "User" 的对象。如何将该对象传递给位于 Main class?

中的另一个 OnButtonClick 函数

您不能调用 OnClick 事件并传递与事件签名中的参数不同的内容。如果您需要这样的东西,那么也许您应该考虑重申您的应用程序的架构。

关于 wxDialog 要知道的一件重要事情(以防你还不知道)是在堆栈上创建它们是完全可以的(大多数 wxWidgets windows 应该在堆)。

这意味着您的对话框实例即使在用户按下 "Ok" 关闭后仍然可用。您可以通过以下代码测试用户响应:

... existing method ...

AddUser dialog (this);

if (dialog.ShowModal() == wxID_OK)
{
    ... process new user ...
}

因为对话框仍然是实例化的,所以您可以在对话框代码中包含一个方法,return如下新用户:

User AddUser::GetUser ()
{
    return newUser;
}

但是,您当然应该注意实际创建新用户的位置。例如,如果新用户对象是在对话框中本地创建的,那么您将需要复制它(如上例所示)。如果它是在堆上创建的(我不建议这样做),那么您可以 return 一个指针。第三种选择是传递对 GetUser 方法的引用,因此对话框方法如下所示:

bool AddUser::GetUser (User& user)
{
    // Make sure that all fields are valid. Simple example given, but
    // should be more complete.
    if (TextName->GetValue() != "" && TextSurname->GetValue() != "")
    {
        user.setName(TextName->GetValue());
        user.setSurname(TextSurname->GetValue());

        return true;
    }
        return false;

    return newUser;
}

调用如下所示:

void wxBiblioFrame::OnButAddUserClick(wxCommandEvent& event)
{
    AddUser dialog(this);
    myUserDialog dialog (this);

    myUserClass newUser;

    if (dialog.ShowModal() == wxID_OK)
    {
        if (dialog.GetUser (newUser))
        {
            ... process and store the new user ...
        }
        else
        {
            ... handle the error ...
        }
    }

    // NOTE: no need to Destroy() the dialog.
}

顺便说一下,除非您的用户 class 很大,否则从效率的角度来看,我不会太担心复制对象。创建和关闭对话框可能会使制作副本所花费的时间相形见绌。