Инициализировать указатель объекта в другом классе с помощью указателя функции

0

Рассмотрим следующее. Класс 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&
Теги:
pointers

1 ответ

1
Лучший ответ

Чтобы ответить на ваш вопрос относительно "Что такое стандартный способ сделать что-то подобное", я предполагаю, что вы имеете в виду передачу функций-членов и/или общих указателей функций и их выполнение с некоторыми данными. Некоторые популярные реализации, которые обеспечивают эту способность:

  1. FastDelegate
  2. станд :: функция
  3. повышение :: функции

Это действительно зависит от предпочтений и выбора библиотеки. Лично я использовал 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;
};
  • 0
    Круто, спасибо за ссылки! Мой пример действительно работает, если я объявляю function как static в классе B , но я не уверен почему. Вы случайно не знаете?
  • 0
    Это работает, потому что в простых терминах добавление static function причин больше не имеет указатель this a B Он по-прежнему поддерживает область своего класса с B но больше не требует объекта B для выполнения функции. См. Msdn.microsoft.com/en-us/library/yyh8hetw.aspx. Это было одно из простых объяснений, которое я смог найти. Опять же, это довольно низкоуровневое объяснение влияния статики в этом случае.
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню