2013-12-06 5 views
0

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

Более простой пример:

class functions{ 
     public: 
      int a(); 
      int b(); 
      int F(int (*f)()); //f can only be a() or b() 
}; 

Перед тем, как поместить их в классе, у меня было что-то вроде

if(f!=a || f!=b) cout<<"error"; 

С класса, это кажется просто получить более сложным, так как я считаю, я теперь нужно передать экземпляр класса или что-то, чтобы избавиться от моего error: invalid use of member function

Я только начал изучать перечислимые списки, и похоже, что это сработало бы, если бы я с обычными переменными. Могу ли я создать перечисление функций?

Каков наилучший способ ограничить функции, которые могут быть переданы другой функции?


Я проводит статический метод произнесения, но по-прежнему нуждается в помощи с Int F (Int (* е)());

int functions::F(int (functions::*f)()) 
{ 
    if(f==functions::a) 
     //gives error: invalid operands of types 'int (functions::*)()' 
      // and 'int (int(*)()' to binary operator ==' 

    int x=f(); 
     //gives error: must use ‘.*’ or ‘->*’ to call pointer-to-member 
      //function in 'f(...)' 

    int y=(functions.*f)(); 
     //gives error: expected primary-expression before ‘.*’ token 

    return 0; 
} 
+0

Ваш исходный код был действительно 'е = & a' , только адрес был неявным. Ну, нет никакого неявного адреса для функций-членов, вам действительно нужно сказать '& functions :: a'. Позже, чтобы назвать это, вы, вероятно, хотите сказать '(this -> * f)()' –

+0

, что означает «неявный адрес для функций-членов»? – albiero

+0

Это означает, что вы не можете оставить & if, если хотите, указатель на член. И вы не можете оставить * при использовании указателя на члена. –

ответ

0

Это действительно зависит от того, что вы хотите достичь: Я бы сказал, что в значительной степени, что такого рода ограничения лучше всего подтверждено проверки кода, а не кодирование ...

Другим решением является не используйте эту конструкцию вообще и создайте функцию Fa() и Fb(), которая вызывает функции (частные) a() и b().

И остальная часть вопроса «как вызвать функцию-член класса» -The ответ на который сильно зависит от того, имеет ли Functions переменные-члены, которые используются в a() и b() или нет. Если нет функций-членов, то объявление a() и b() членов будет static. С другой стороны, если вы хотите использовать «указатель на функцию-член», синтаксис равен int (Functions::*f) и &Functions::a соответственно, и вызов должен быть выполнен с использованием экземпляра Functions. поэтому, если у нас есть Functions fun, вы бы сделали fun.*f(). Или (*this).*f(), insice F().

+0

Знаете ли вы хороший учебник о том, как я мог реализовать создание() и b() static, передавая их, а затем используя их в моем коде? Google, похоже, дает мне много результатов о нестатических функциях-членах, но не очень помогает в статике.Я получаю много сообщений об ошибках, я не могу интерпретировать «ошибка: не могу преобразовать» double (double (*) (double), int, double, double, bool) 'to' double (Integrators :: *) (double (*) (double), int, double, double, bool) 'в присваивании else if (Meth = Integrators :: Midp)' и 'error: должен использовать'. * 'или' -> * 'для вызова указателя- to-member в 'Meth (...)' – albiero

+0

Просто вставьте «satic» перед именем и используйте его как 'Функции :: a' и' Функции :: b'. –

0

Вы можете обернуть принятую функцию в классе:

#include <iostream> 

class Functions 
{ 
    public: 
    int a() { return 0; } 
    int b() { return 1; } 
}; 

class Accept 
{ 
    public: 
    typedef int (Functions::*AcceptFunction)(); 
    int apply(Functions& object, AcceptFunction function) { 
     return (object.*function)(); 
    } 
}; 


int main() 
{ 
    Functions functions; 
    Accept accept; 
    std::cout << accept.apply(functions, &Functions::b) << std::endl; 
} 

(Вы можете связать его, делая функций вложенного класса в Accept)

Смежные вопросы