2012-01-10 4 views
0

Как я могу повторно использовать функцию?VC++ «Повторно использовать» функцию?

Хорошо позволяет сказать, что у меня есть это «основная» функция ниже:

bool A = false; 
bool B = true; 
void MainFunction(bool Whatever) { 
    if(!Whatever) { 
     A = true; 
     if(A) { 
      B = false; 
     } else if(!A) { 
      B = true; 
     } 
    } 
} 

Теперь я хочу, чтобы сделать новую функцию с помощью MainFunction, что-то вроде этого:

MainFunction ANewFunction(false); 
MainFunction AnotherNewFunction(true); 

Очевидно, что вонн» t, так есть ли способ «повторного использования» функции как другой функции?

+1

Если новая функция делает больше работы наряду с предыдущими функциями работают, вызов предыдущая функция в новой функции. Не слишком уверен в том, чего вы хотите достичь, возможно, вы можете пересмотреть свой дизайн кода. –

+0

Ну, это фактически функция, которую я использую. Мне просто интересно. – Bawss

ответ

0
typedef int (*function_t)(int); // new type - defines function type - address of function 


// your function, PrevFunction is simply variable holding address of the function: 
int PrevFunction(int one) { return one; } 

// new variable of type function_t initialized by PrevFunction address: 
function_t NewFunction = PrevFunction; 

//And finally we can use either PrevFunction or NewFunction - they point to the same function body: 

int a = PrevFunction(1); // a == 1 
int b = NewFunction(2); // a == 2 
+0

Ну, не совсем то, что я искал, но эй, я кое-что узнал из этого куска кода :). – Bawss

+0

Просто понял, что вам просто нужны эти два псевдонима: '#define ANewFunction MainFunction (false)' и '#define AnotherNewFunction MainFunction (true)' –

1

Вы не можете «повторно использовать» функции, по крайней мере, не так, как я понимаю ваш вопрос.

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

void PrevFunction(int one) 
{ 
    int i = one; 
    // do whatever 
} 

void NewFunction(int one) 
{ 
    PrevFunction(one); 

    // do new stuff 
    // ... 
} 

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

+0

Но проблема в том, что PrevFunction имеет логическое значение. Будет ли создание другого эффекта NewFunction логическим? – Bawss

+0

Причина моей цели в основном в том, чтобы сделать новую копию PrevFunction, и я не хочу перекодировать PrevFunction для каждой функции, которая точно делает то же самое. – Bawss

+0

@Bawss: Я не совсем уверен, что вы подразумеваете под «имеет логическое значение». Измените свой вопрос, чтобы включить в него некоторый код примера. –

4

У вас есть одна функция вызова другой. Например:

void ANewFunction() { 
    MainFunction(false); 
} 
void AnotherNewFunction() { 
    MainFunction(true); 
} 

Вы даже можете получить фантазии:

#include <functional> 
auto ANewFunction = std::bind(&MainFunction, false); 
auto AnotherNewFunction = std::bind(&MainFunction, true); 

В любом случае, вы можете позвонить ANewFunction или AnotherNewFunction и MainFunction будет вызвана с данным аргументом. (В последнем случае, они на самом деле не функции больше Они называются функциональными объекты или функторов, но кал до сих пор называют их так же, как обычные функции:.. ANewFunction())

+0

Мне нравится причудливый способ: P – Bawss

+0

'bind' - это именно то, что отвечает на вопрос. Это должно быть принято! – bitmask

0

Просто позвоните MainFunction с другим функционировать?

void ANewFunction() 
{ 
    MainFunction(false); 
} 
void AnotherNewFunction() 
{ 
    MainFunction(true); 
} 

Если ваш вопрос как вы делаете AnotherNewFunction обратитесь к другому А и В, чем ANewFunction, ответ вы не можете, по крайней мере, не без помощи MainFunction. Вы можете, однако, обновить MainFunction:

void MainFunction(bool Whatever, bool& A, bool& B) { 
    if(!Whatever) { 
     A = true; 
     if(A) { 
      B = false; 
     } else if(!A) { 
      B = true; 
     } 
    } 
} 
bool A1 = false; 
bool B1 = true; 
void ANewFunction() 
{ 
    MainFunction(false, A1, B1); 
} 
bool A2 = false; 
bool B2 = true; 
void AnotherNewFunction() 
{ 
    MainFunction(true, A2, B2); 
} 
0

Другого новомодным решение, используя Lambda в:

auto ANewFunction = [](){ MainFunction(false); } 
auto AnotherNewFunction = [](){ MainFunction(true); }