2017-01-24 4 views
0

У меня проблема. У меня есть два класса, и мне нужно, чтобы передать члену одного в качестве параметра к другому члену другого класса, например:Как передать член класса другому члену другого класса

class A{ 
public: 
     int functionA(string x); 
. 
. 
.}; 

И

class B{ 
public: 
    void functionB(/*here would go functionA*/); 
. 
. 
. 
}; 

Это как functionB(...) будет выглядеть.

void B::functionB(/*functionA*/){ 
string x = generateString(); 
functionA(x); 
. 
. 
. 
} 

Как я мог это сделать? Я пробовал с function<int(string)>& fun, но похоже, что это не предназначено, когда есть классы. Я также пробовал functionB(int(aClass::*func)(string),aClass& a), но тот же результат, что и раньше.

Любая помощь будет оценена по достоинству.

Спасибо!

+0

ли вы 100% хотите передать функцию? Вы можете передать ссылку на класс, а затем вызвать метод на нем. Если вы действительно хотите обратный вызов указателя функции, пожалуйста, подтвердите. Если вы хотите использовать метод, можете ли вы указать, какой стандарт C++ вы используете? Это может помочь немного направить ответы. Спасибо – ccpgh

+0

Я просто хочу, чтобы использовать 'functionB' на' functionA' наиболее эффективным способом. Im using C++ 11 – Capie

ответ

1

Если вы используете C++ 11 или выше, вы можете сделать это с помощью лямбда:

class A 
{ 
public: 
    void functionA(const std::string& x) 
    { 
     // do something with string 
    } 
}; 

class B 
{ 
public: 
    void functionB(const std::function<void(const std::string&)>& lambda) 
    { 
     lambda("test"); 
    } 
}; 

И когда вы это называете, вы могли бы сделать:

A a; 
B b; 
b.functionB([&a] (string x) { a.functionA(x); }); 

Полный демо здесь: http://cpp.sh/5w6ng

+0

Вы уверены, что это сработает, учитывая, что я хочу, чтобы параметр 'functionA' был строкой, созданной внутри' functionB'? – Capie

+0

@ Капи, да, она должна работать нормально. Посмотрите пример ссылки, которую я опубликовал для демонстрации. –

1

Я попытался с функцией & весело, но похоже, что не предназначено, когда есть классы.

Похоже, вы пытались неправильный путь, он работает просто отлично:

class A { 
public: 
    void foo(std::string str) { std::cout << str << std::endl; } 
}; 

int main() 
{ 
    A a; 
    std::function<void(std::string)> f = std::bind(&A::foo, &a, std::placeholders::_1); 
    f("test"); 
} 

live example

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