2013-09-11 4 views
-5

Мне нужно вызвать функцию «general_function()», когда установлены два параметра. Как:Головоломка + Указатели функций

.cpp файл

if (var_a == 1) { 
    general_function(); 
} 

if (var_b == 1) { 
    generam_function(); 
} 

определение general_function является:

function general_function() { 
    // Some 40 lines 
    // Some 20 lines .. * 
    // Some 40 lines 
} 

Сейчас ситуация такова, что в обоих вызовов, 20 строк, которые я помеченные * различны. Таким образом, когда var_a установлен, будет выполнен набор из 20 строк, и когда будет задан параметр var_b, будет выполнен другой набор из 20 строк.

Существует множество способов преодоления этих ситуаций. Создавать функции, передавать параметры и т. Д. Но я хотел сделать что-то из мира ООП. И именно поэтому я создал там указатель функций. Таким образом, это то, что я сделал:

файл .h

bool function is_a_set(string str, char* name) { 
    // Do something 
} 

bool function is_b_set(string str, char* name) { 
    // Do something 
} 

файл .cpp

if (var_a == 1) { 
    general_function(is_a_set); 
} 

if (var_b == 1) { 
    general_function(is_b_set); 
} 

определение general_function является:

function general_function(bool (*choice)(string, char*)) { 
    // Some 40 lines 
    choice(string, char*); 
    // Some 40 lines 
} 

Я надеюсь, что это понятно до сих пор. Но я получаю «ошибка: нет функции соответствия для вызова general_function()»

Можете ли вы что-нибудь

+4

'function' не является ключевым словом в C++, это? –

+1

«Есть много способов преодолеть эти ситуации». ?? * Какая ситуация? * Тест 'if' ?? Вы спрашиваете, как условно выполнять код без фактического тестирования состояния? – WhozCraig

+0

функция не является ключевым словом ... имеет тип OP def'd или определяет его как класс? – UpAndAdam

ответ

1

Таким образом, чтобы избежать сложностей указателей на функции и решать это в более объектно-ориентированного рода способом, следует использовать наследование и виртуальные функции.

class BaseThing 
{ 
public: 
    bool generalFunction() 
    { 
     // some 40 lines of code 

     specialMethod(); 

     // some other 40 lines of code 
    } 

    virtual void specialMethod() = 0; 
}; 

class AThing : public BaseThing 
{ 
public: 
    virtual void specialMethod() 
    { 
     // special code for A 
    } 
}; 

class BThing : public BaseThing 
{ 
public: 
    virtual void specialMethod() 
    { 
     // special code for B 
    } 
}; 

Тогда просто использовать нужный вам объект для данной ситуации:

BaseThing* thing = new AThing(); 

thing->generalFunction(); 

delete thing; 

thing = new BThing(); 

thing->generalFunction(); 
+0

Я не уверен, что 'general_function()' является даже членом класса, по крайней мере, на основе публикации OP. – WhozCraig

+0

Я знаю, я сделал некоторые предположения. Но он сказал, что хочет чего-то большего ОО, и я подумал: «Позвольте мне просто показать ему какой-то код, который затрагивает потенциально подобную проблему». Я согласен. –

+1

Молодцы. Для этого нужны виртуальные функции и полиморфизм. –

0

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

void general_function(bool (*choice)(string, char*)) { 
    /**/ 
} 
+1

Ха-ха. :) В чем разница вашего указателя на функцию и синтаксиса указателя моей функции.? –

+0

Это был ваш предыдущий вопрос, который вы обновили, когда я комментировал. –

0

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

В классе:

.
private int var_a; 
private int var_b; 

И в общем методе:

void general_function() 
{ 
    //40 lines that run no matter which variable is set 
    if (var_a == 1) 
    { 
     //20 lines that run if var_a is set 
     //or better yet, call a submethod 
    } 
    //if var_a and var_b are mutually exclusive, use else if 
    if (var_b == 1) 
    { 
     //20 lines that run if var_b is set 
     //or better yet, call a submethod 
    } 
    //40 more lines that run no matter which variable is set 
} 
Смежные вопросы