Я регулярно применяю декларации и указатели вперед к таким классам.Любой способ в C++ переслать объявление прототипа функции?
Теперь мне нужно передать указатель функции через несколько слоев. Я бы предпочел включить заголовок, который объявляет прототип моего указателя функции только в модуль, который разыскивает указатель на функцию, а не на каждый уровень, который просто проходит вдоль этого значения указателя.
Возможно ли это?
=====
Из ответов я подозреваю, что я не высказал вопрос достаточно ясно. Я ищу аналог для объявления прямого класса. Мы все согласны с тем, что я могу написать:
класс foo;
void bar (foo *);
void waz (foo * p) {bar (p); }
Обратите внимание, что waz ничего не знает о классе foo, отличном от его имени. Возможно, бар будет иметь доступ к полному описанию foo. Возможно, бар просто пройдет дальше. Какая разница? Только те сайты, которые разыгрывают foo *. Все остальные сайты нуждаются только в «классе foo;».
Точно так же я знаю, что я могу написать:
ЬурейеГо ничтожной Foo (INT, двойной);
void bar (foo *);
void waz (foo * p) {bar (p); }
Разница заключается в том, что теперь идентификатор foo не только известен как тип функции, но и далее уже содержит полную подпись/прототип. Это приводит меня в один из двух неприятных сценариев:
1) клонировать typedef на нескольких сайтах (yuck! Fragile!) 2) придерживаться typedef в заголовке и включать его везде, где упоминается foo *.
Обратите внимание на асимметрию: в случае объекта данных мне нужно было предоставить полное описание класса foo в тех точках, где я хочу разыменовать foo *; в случае функции мне нужно предоставить полную подпись/прототип везде, где я хочу упомянуть foo *.
Итак, есть ли способ устранить эту асимметрию?
Нет асимметрии. Вы можете переслать объявление класса и функции, а не typedef. Typedef - это просто псевдоним, он больше не существует во время соединения, поэтому нет ничего, чтобы переслать объявление об этом. –
Ваш аргумент ошибочен. Да, при использовании функция должна существовать во время соединения или вы получаете неопределенную ошибку символа. OTOH, объявленный вперед класс не имеет. Экземпляры такого класса могут существовать, но они не являются тем, что обозначено форвардным объявленным именем класса. Переадресованное объявленное имя класса обозначает класс, а не объект, занимающий хранилище. –
"_A forward объявленное имя класса обозначает ** [тип] **, а не объект, занимающий хранилище.« Точно так же, как указатель функции обозначает ** тип **, а не функцию, занимающую инструкции (и точку входа) в программа. Я хочу сказать, что речь идет не о 'typedef'; это не имеет значения. –