Рассмотрим следующее. Класс A
имеет указатель на функцию в качестве члена и принимает функцию в своем конструкторе для перехода к этому члену. В отдельном файле у меня есть класс B
который содержит указатель на класс A
в качестве члена, а класс B
также имеет в качестве функции функцию, которую я хочу передать классу A
Ниже приведен пример и ошибки, которые я получаю. Какой стандартный способ сделать что-то подобное?
Ах:
class A {
private:
int (*func)(int);
public:
A(int (*func_)(int));
};
A::A(int (*func_)(int)) : func(func_) {}
Bh:
#include "A.h" // Why can't I forward declare A instead?
class B {
private:
A *A_ptr;
int function(int); // some function
public:
B();
~B();
};
int B::function(int n) {
return n+2; // some return value
}
B::B() {
A_ptr = new A(function);
}
B::~B() {
delete A_ptr;
}
main.cpp:
#include "B.h"
int main() {
B b;
}
Ошибки, которые я получаю:
B.h: In constructor ‘B::B():
B.h:18:25: error: no matching function for call to ‘A::A(<unresolved overloaded function type>)
B.h:18:25: note: candidates are:
A.h:9:1: note: A::A(int (*)(int))
A.h:9:1: note: no known conversion for argument 1 from ‘<unresolved overloaded function type> to ‘int (*)(int)
A.h:1:7: note: A::A(const A&)
A.h:1:7: note: no known conversion for argument 1 from ‘<unresolved overloaded function type> to ‘const A&
Чтобы ответить на ваш вопрос относительно "Что такое стандартный способ сделать что-то подобное", я предполагаю, что вы имеете в виду передачу функций-членов и/или общих указателей функций и их выполнение с некоторыми данными. Некоторые популярные реализации, которые обеспечивают эту способность:
Это действительно зависит от предпочтений и выбора библиотеки. Лично я использовал FastDelegate большую часть времени, а затем std :: function после этого.
Все ссылки, которые я опубликовал, должны содержать информацию об учебном пособии, чтобы вы могли работать и показывать, как правильно передавать и хранить функции-члены и/или общие указатели функций с легкостью.
Вот пример использования FastDelegate с вашим примером:
class A
{
public:
// [1] This creates a delegate type. Can used for any function,
// class function, static function, that takes one int
// and has a return type of an int.
typedef FastDelegate1< int, int > Delegate;
// [2] Pass the delegate into 'A' and save a copy of it.
A( const Delegate& delegate ) : _delegate( delegate ) { };
void execute()
{
// [7]
// Result should be 10!
int result = _delegate( 8 );
}
private:
// [3] Storage to save the Delegate in A.
Delegate _delegate;
};
class B
{
public:
B()
{
// [4] Create the delegate
A::Delegate bDelegate;
bDelegate.bind( this, &B::function );
// [5] Create 'A' passing in the delegate.
_aPtr = new A( bDelegate );
// [6] Test it out!! :)
// This causes 'A' to execute the Delegate which calls B::function.
_aPtr->execute();
}
~B()
{
delete _aPtr;
}
int function( int n )
{
return n+2;
}
private:
A* _aPtr;
};
function
какstatic
в классеB
, но я не уверен почему. Вы случайно не знаете?static
function
причин больше не имеет указательthis
aB
Он по-прежнему поддерживает область своего класса сB
но больше не требует объектаB
для выполнения функции. См. Msdn.microsoft.com/en-us/library/yyh8hetw.aspx. Это было одно из простых объяснений, которое я смог найти. Опять же, это довольно низкоуровневое объяснение влияния статики в этом случае.