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

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

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

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

22.01.2013, 11:30. Просмотров 288. Ответов 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);
Как такое сделать?
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
22.01.2013, 11:30
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Расширение функциональности #define (C++):

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

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

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

c++11 и $define - C++
Есть код который прекрасно компилируется без -std=c++11, но как только я включаю эту опцию то константы препроцессора не заменяются и...

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

#define - C++
Здравствуйте, дорогие программисты! сразу хочу сказать, что в С++ я совсем недавно, поэтому толком ничего не знаю Во-первых,...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Croessmah
Эксперт CЭксперт С++
13226 / 7498 / 845
Регистрация: 27.09.2012
Сообщений: 18,417
Записей в блоге: 3
Завершенные тесты: 1
22.01.2013, 12:00 #2
Си'шное шаманство на препроцессоре? Может стоит посмотреть на шаблоны?
0
IvanPryamoy_2
0 / 0 / 0
Регистрация: 21.01.2013
Сообщений: 23
22.01.2013, 12:33  [ТС] #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-ов не определишь), но в моем случае- подходит
0
Croessmah
Эксперт CЭксперт С++
13226 / 7498 / 845
Регистрация: 27.09.2012
Сообщений: 18,417
Записей в блоге: 3
Завершенные тесты: 1
22.01.2013, 12:39 #4
Как раз таки препроцессор будет вставлять код а в случае с шаблоном компилятор создаст соответствующий класс
0
IvanPryamoy_2
0 / 0 / 0
Регистрация: 21.01.2013
Сообщений: 23
22.01.2013, 17:16  [ТС] #5
Цитата Сообщение от Croessmah Посмотреть сообщение
Как раз таки препроцессор будет вставлять код а в случае с шаблоном компилятор создаст соответствующий класс
У меня define создал класс и теперь можно удобно пользоваться этим классом (например создавать объекты и видеть поля после установки ".").

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

Я же четко пояснил, что запись кода должна быть краткой (макросом).
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
22.01.2013, 17:16
Привет! Вот еще темы с ответами:

define - C++
И еще такой вопрос для чего служит #define ??

define не - C++
Здравствуйте. &quot;Дефайню&quot; &quot;%f&quot; для вывода: #define fss &quot;%f&quot;; . И потом делаю вывод вот такой вот: for(i=0;i&lt;n;i++) fscanf(in,fss,&amp;a-&gt;di);. И...

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

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


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
22.01.2013, 17:16
Ответ Создать тему
Опции темы

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