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 很大,否则从效率的角度来看,我不会太担心复制对象。创建和关闭对话框可能会使制作副本所花费的时间相形见绌。
有人可以向我解释如何将自定义 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 很大,否则从效率的角度来看,我不会太担心复制对象。创建和关闭对话框可能会使制作副本所花费的时间相形见绌。