c ++ указатель на функцию - PullRequest
       9

c ++ указатель на функцию

0 голосов
/ 25 октября 2011

Я делаю class Button;, какой конструктор получает указатель на функцию, которая будет выполняться при клике. Есть ли простой способ определить функцию, которую я хочу дать? Как без имени .. например, когда я создаю кнопку, просто чтобы открыть области и написать функцию без специального имени. Потому что мне нужно создать много кнопок, и я не хочу писать функцию для каждой кнопки и со своим собственным именем ... (конфликт имен и т. Д.)

как например этот код Java:

someObject.addMyListener(new MyListener() {
  public void processEvent(MyEvent e) {
    // How do you access the variable outerClassField?
  }
});

возможно я ошибаюсь, но мы пишем функцию MyListener НА МЕСТЕ без какого-либо специального имени или предварительного определения.

Возможно ли это в с ++?

Ответы [ 4 ]

3 голосов
/ 25 октября 2011

C ++ 11 представляет лямбда-выражения, которые являются анонимными функциями, способными захватывать переменные.

См. Наш FAQ: Что такое лямбда-выражение в C ++ 11?

1 голос
/ 25 октября 2011

Используйте std::function< void() > (или реализацию Boost, если ваш компилятор еще не включает TR1).Он может быть установлен на что угодно , которое может быть вызвано с помощью thing().

1 голос
/ 25 октября 2011

Виртуальная функция в классе Button и ее переопределение в производном классе.Для каждого типа Button, который вы хотите создать, создайте новый класс, производный от Button с его собственной реализацией функции OnClick.

В этом весь смысл полиморфизма в объектно-ориентированномязык.

0 голосов
/ 25 октября 2011

Анонимные классы в стиле Java (именно это вы и делаете в своем примере) могут быть похожи на лямбда-функции, но их стоит рассмотреть только в том случае, если вы используете новейший стандарт C ++ (Google C ++ 11).

Если вы не используете C ++ 11, вы можете вместо этого передать указатель на функцию, которая не определена в классе или является статическим методом. Никогда не передавайте указатель на нестатический метод, поскольку это может вызвать серьезные головные боли, если вы не будете осторожны.

Но, вообще говоря, вы тоже не хотите этого делать. Как уже говорили другие, просто создайте класс и передайте на него указатель. По сути, это то, что вы делаете в своем примере с Java, за исключением того, что вы делаете это встроенным.

Приятной особенностью C ++ является то, что вы можете определить более одного класса в исходном файле и не указывать его в заголовочном файле, если не хотите, чтобы он был частью общедоступного интерфейса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...