0

我是 C++ 新手,以前从未使用过宏,但我相信它们可以让我解决以下问题,尽管我欢迎其他解决方案。

我写了以下宏:

#define COMMAND(NUMBER){ button_ ## NUMBER ## ->hide(); }

我想这样称呼它

for (int i = 1; i < 10; i++)
{
    COMMAND(i)
}

希望当程序执行时它会做相当于:

button_1->hide();
button_2->hide();
button_3->hide();
button_4->hide();
       .
       .
button_10->hide();

这个想法是,我想根据加载表单时读取的配置文件动态地制作 FLTK GUI 显示/隐藏小部件。

不幸的是,上面的宏似乎不起作用,而是它的作用是

button_i->hide();

这会导致编译错误,因为 button_i 不存在!

所以我的问题是:
A)是否可以在 C++ 中做到这一点?
B)宏能做到这一点吗?
C) 如果不能,那还能做什么?
D)如果宏可以做到这一点,那么我该如何修改上面的代码才能真正让它工作!

谢谢

4

3 回答 3

1

我很确定有一种方法可以使宏技巧起作用,但是还有更好的选择。

例如,您可以将按钮存储在数组中。

假设您的按钮有一个名为 的类型struct button,请像这样声明您的按钮:

struct button *buttons[42];

您需要像对单独的 button_X 变量一样初始化所有这些变量。

button[i] = <whatever you do to create button number i>;

然后你可以简单地做:

for (int i=0; i<42; i++) {
  button[i]->hide();
}

或仅使用其编号切换任何单个按钮。从长远来看,您可能会发现这比任何宏观技巧都要好。

(警告:数组是0基于 - 的,所以你的第一个按钮是button[0]

于 2011-04-01T15:47:32.887 回答
0

如果您可以控制button_2等变量,我建议您改用数组。这样你就可以使用如下外观:

for (int i = 1; i < 10; i++)
{
  button[i]->hide();
}

当然,这在宏中是微不足道的。

通常,您无法使用 C 中的普通循环完成您想要的。但是,如果您真的想走这条路,请查看 boost 预处理器包。

于 2011-04-01T15:47:52.043 回答
-1

不要尝试自己管理按钮,FLTK 不喜欢这样。您将拥有一系列您看不到的很棒的按钮。我不确定如何按照您想要的方式进行操作,但我会这样做:

Fl_Button * o = (Fl_Button *)myWindow->child(i);
o->hide();

并让按钮成为 FLTK 窗口的子级。

于 2013-02-19T23:22:15.063 回答