2015-03-24 4 views
0

Я работаю над проектом с использованием программирования на основе интерфейса. Первая часть этого - для контекста на случай, если кто-то скажет, что я делаю что-то совершенно неправильное или имеет другой подход, который исправляет мою проблему.Функциональный указатель на функцию класса интерфейса в конструкторе дочернего класса

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

Этот контейнерный класс содержит вектор частей, которые не знают о классе контейнера и поэтому не содержат заголовки интерфейса.

Каждая деталь является объектом того же типа. При создании этих объектов он передает указатель на функцию в качестве аргумента конструктору дочерних объектов. Этот аргумент является указателем на функцию, определенную в одном из классов интерфейса.

Я пытаюсь передать указатель, используя &iTheInterfaceClass::theDataFunction конструктору, ожидающему U16(*pDataFunction)().

Это приводит к ошибке cannot convert 'U16 (iTheInterfaceClass::*)() {aka short unsigned int (iTheInterfaceClass::*)()}' to 'U16 (*)() {aka short unsigned int (*)()}' in initialization

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

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

+0

Вам нужно будет сделать статическую функцию 'theDataFunction'. Но использование указателей функций с объектами «плохо пахнет». –

+0

Вам не повезло. Функция-член нуждается в дополнительном параметре для 'this'. –

+0

@MatsPetersson Если единственное, что отличается между объектами, это вызов функции (расположение данных) в общем интерфейсе, почему, в частности, это «плохо пахнет»? –

ответ

0

Как вы сами сказали ваш конструктор ожидает следующий вид (за исключением имен):

U16 (*)() 

Однако, вы пытаетесь передать следующий тип:

U16 (iTheInterfaceClass::*)() 

Ваш конструктор принимает бесплатные функции и функции класса, которые являются статическими, но вы пытаетесь передать нестатические функции-члены. Они не одного типа.

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

Это может выглядеть примерно так:

public: 
    typedef U16(iTheInterfaceClass::*MemberFunctionPtr)(); 

    MyContainer(iTheInterfaceClass& member, MemberFunctionPtr function) : ... { ... } 

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

(member.*function)(); 

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

+0

Спасибо за объяснение. Как оказалось, я переработал систему, чтобы полностью избежать этой проблемы. Это было тупиковое решение. –

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