Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
IvanPryamoy_2
0 / 0 / 0
Регистрация: 21.01.2013
Сообщений: 23
#1

Расширение функциональности #define - C++

22.01.2013, 11:30. Просмотров 284. Ответов 4
Метки нет (Все метки)

Visual Studio 2012, Win7x64Prof

У меня есть код условно на 10 строк, в котором меняется 2-3 параметра. Например, создание нового класса путем наследования с добавлением public указателя (надо новое название, конструктор). Функцией всего этого не сделаешь, надо чтобы генерился "текст" кода с новыми названиями.

Итак, в коде делаю запись (сначала указываю название нового класса, а потом новый указатель):
C++
1
CLASS(ClassWithPointer, double* MyPointer);
И все это в коде разворачивается (без замены и подстановки) в нечто подобное:
C++
1
2
3
4
5
6
7
class ClassWithPointer: public BasicClass
    {
    public:
        double* MyPointer;
        ClassWithPointer (/*переменные базового класса*/):/*вызов конструктора базового класса*/{}
        ClassWithPointer(){}
    };
И теперь в коде досупна запись:
C++
1
ClassWithPointer MyPerem;
Важно, чтобы код не вставлялся: не зачем захламлять код очевидными строками. Он должен так и оставаться в сокращенной форме:
C++
1
CLASS(ClassWithPointer, double* MyPointer);
Как такое сделать?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
22.01.2013, 11:30     Расширение функциональности #define
Посмотрите здесь:

Режим ограниченной функциональности - C++
1) Найти сумму и число тех элементов заданного массива X1,X2, … ,Xn, которые попадают на заданный отрезок. 2)Задан целочисленный...

Увеличение функциональности без использования наследования. Как? - C++
Добрый день. Можно ли как-нибудь еще увеличить функциональность своего класса без использования наследования? Делаю свой класс А, в нем...

virtual function. Сохранение функциональности базового и класса наследника - C++
Как сделать так чтобы при вызове n.attack() или enemy->attack() выводилось надпись и " I'm enemy class " и "ninja attack !!! ". Другими...

#define c :: - C++
Подскажите как реализовать такую замену: #define sa2::sys::getClientKernel()->getXDBTManager() cls_SimpleXDBTManager::Instance() ...

define - C++
Всем здрасьте , что означает эта строчка? #define MAX(a,b) a>b? a:b

#define - C++
#define зачем нужна это заголовочный файл какие у него функции и как им ползоватса?

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Croessmah
Модератор
Эксперт CЭксперт С++
13051 / 7314 / 814
Регистрация: 27.09.2012
Сообщений: 18,052
Записей в блоге: 3
Завершенные тесты: 1
22.01.2013, 12:00     Расширение функциональности #define #2
Си'шное шаманство на препроцессоре? Может стоит посмотреть на шаблоны?
IvanPryamoy_2
0 / 0 / 0
Регистрация: 21.01.2013
Сообщений: 23
22.01.2013, 12:33  [ТС]     Расширение функциональности #define #3
Цитата Сообщение от Croessmah Посмотреть сообщение
Си'шное шаманство на препроцессоре? Может стоит посмотреть на шаблоны?
Шаблон вставит кусок кода.

Я добился вообще-то результата с одной заковыкой: как в параметрах #define использовать запятую, чтобы компилятор не воспринимал это как дополнительный параметр?

Например пишу так (параметра в макросе всего 4):
C++
1
#define MY_MACROS(NameClass, TypeBasic, TypePointer, NamePointer) class NameClass : public TypeBasic{public:TypePointer* NamePointer;NameClass (clong Quantity1_V, clong Quantity2_V = -1, clong Quantity3_V = -1):SmartArray(Quantity1_V, Quantity2_V, Quantity3_V){}NameClass(){}};
Дальше в коде использую так:
C++
1
MY_MACROS(cArray,  SmartArray<long,2>,  SmartArray<long, 1>,  Array2)
, но компилятор воспринимает запятые, разделяющие параметры шаблона, как делители (и считает, что параметров слишком много, о чем выдает ошибку). Как передать тип данных "SmartArray<long,2>"?

UPDATE:
Добавлено через 12 минут
Обошел небольшим извращением. Определил новые define-ы, которые внутри себя "съели" запятые:

C++
1
2
3
#define SmartArray1(Type) SmartArray<Type, 1>
#define SmartArray2(Type) SmartArray<Type, 2>
#define SmartArray3(Type) SmartArray<Type, 3>
Теперь вызов макроса изменился:
C++
1
MY_MACROS(cArray,  SmartArray2(long),  SmartArray1(long),  Array2)
В общем случае, конечно, не айс (второй параметр может принимать и миллион значений и столько define-ов не определишь), но в моем случае- подходит
Croessmah
Модератор
Эксперт CЭксперт С++
13051 / 7314 / 814
Регистрация: 27.09.2012
Сообщений: 18,052
Записей в блоге: 3
Завершенные тесты: 1
22.01.2013, 12:39     Расширение функциональности #define #4
Как раз таки препроцессор будет вставлять код а в случае с шаблоном компилятор создаст соответствующий класс
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
22.01.2013, 17:16     Расширение функциональности #define
Еще ссылки по теме:

Нелепые define-ы - C++
Вопрос... Какой смысл в таких define-ах? Чтобы никто ни черта не понял? оО #define _TRY_BEGIN try { #define _CATCH(x) } catch (x)...

#define catalog - C++
При разростании проекта возникла проблема. Есть к примеру 10 папок. В каждой есть файл типа *.h с названием обьекта и соответственно...

Синтаксис использования #define - C++
#include &lt;iostream&gt; #define LOG_ALL 0; #define LOG_MIDDLE 1; #define LOG_MAIN 2; #define LOG_NONE 3; static int...

Директива #define c директивой #else - C++
Учу Win32 API и столкнулся с таким примером как директиву #define можно использовать с директивой #else? Плюс тут еще куча ошибок непонятно...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
IvanPryamoy_2
0 / 0 / 0
Регистрация: 21.01.2013
Сообщений: 23
22.01.2013, 17:16  [ТС]     Расширение функциональности #define #5
Цитата Сообщение от Croessmah Посмотреть сообщение
Как раз таки препроцессор будет вставлять код а в случае с шаблоном компилятор создаст соответствующий класс
У меня define создал класс и теперь можно удобно пользоваться этим классом (например создавать объекты и видеть поля после установки ".").

Ну а ваш подход: "тычек" правой кнопкой мыши->"вставить фрагмент" вываливает прямо в код то, что я хочу записать одной строчкой (чтобы не читать однообразный код).

Я же четко пояснил, что запись кода должна быть краткой (макросом).
Yandex
Объявления
22.01.2013, 17:16     Расширение функциональности #define
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru