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

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

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

Макросы в С++ - C++

18.02.2013, 13:41. Просмотров 861. Ответов 5
Метки нет (Все метки)

Доброго времени суток. Подскажите, где можно почитать про написание макросов для классов?

У меня есть класс
C++
1
2
3
4
5
6
7
8
class Transition {
    friend class StateMachine;
protected:
    string from;
    string to;
    State *fromRef, *toRef;
    virtual bool checkCondition(StateMachine *m) = 0;
};

У класса ОЧЕНЬ много наследников, которые я определяю следующим образом
C++
1
2
3
4
5
6
7
8
9
class Q1toQ2 : public TransitionWrapper<ActionAskController> {
public:
    Q1toQ2() { from = "Q1", to = "Q2"; }
    bool checkCondition(ActionAskController *ctrl) {
        if(ctrl->getHyperState("ME_SPEAKING")==1.0f) 
           return true;
        else return false;
    }
};
Мне хотелось бы написать макрос для класса, чтобы его использовать так:
C++
1
2
3
4
5
#define DEFTRANS(...) 
 
DEFTRANS("Q6","Q7",ctrl) {
    if(ctrl->getHyperState("ME_SPEAKING")==1.0f) return true; else return false;
}
Помогите информацией, пожалуйста
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
18.02.2013, 13:41     Макросы в С++
Посмотрите здесь:

макросы - C++
Помогите со встроенными макросами, нигде не могу найти. Дайте ссылку на справочник по встроенным макросам либо можно выложить их здесь. ...

Макросы - C++
Написать макрос находящий большое из 4 чисел в студии с++

Макросы - C++
Ребята помогите!Надо переделать все пож макросы.Но в литературе как -то всё обрывками написано.непонятно как целиком программу писать! ...

Макросы - C++
Здравствуйте, сделал программу, а мне еще сказали нужно сделать её с использованием макросов, знаю что это не долго и всё, не мог бы...

макросы - C++
#define EMPTY 0x00 #define ILLEGAL 0xF0 #define B_PRIVATE 0x01 // 1 бит - наличие #define W_PRIVATE 0x03 ...

макросы - C++
#include &lt;iostream&gt; using namespace std; #define printarray(x,y)//вывод массива x-имя массива, y-число элементов???? int main() ...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
lemegeton
2923 / 1352 / 135
Регистрация: 29.11.2010
Сообщений: 2,725
18.02.2013, 16:49     Макросы в С++ #2
Макросы в С++ не очень хорошая идея. Резко ухудшают читаемость кода.

Я, может быть, не вникаю в сутьtm кода, но ваше затруднение явно вызвано недостаточно продуманным архитектурным решением. Если вы можете рассказать назначение подобных ухищрений, возможно есть более компактный способ записи.

Ну хотя бы вместо
C++
1
if(ctrl->getHyperState("ME_SPEAKING")==1.0f) return true; else return false;
стоит
C++
1
2
// Числа с плавающей точкой сравниваются до определенной точности
return fabs(ctrl->getHyperState("ME_SPEAKING") - 1.0f) < EPSILON;
chetty
0 / 0 / 0
Регистрация: 18.02.2013
Сообщений: 8
19.02.2013, 13:12  [ТС]     Макросы в С++ #3
Вопрос решен.

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

Сделала так:
C++
1
2
3
4
5
6
7
8
9
#define DEFTRANS_BEGIN( FROM, TO, CONTROL, CLASS_NAME )\
class CLASS_NAME : public TransitionWrapper< CONTROL > {\
private:\
        HStateServer * hstate;\
public: \
    CLASS_NAME( HStateServer * hstate): hstate(hstate) { from = FROM, to = TO; }\
    bool checkCondition(ActionAskController *m) 
 
#define DEFTRANS_END }
Использую так:
C++
1
2
3
4
5
6
7
DEFTRANS_BEGIN("Q1","Q2",ActionAskController, Q1toQ2) {
    if( 1.0f == hstate->getValueState( "yes" ) ) {
        return true; 
    }
    return false;
}
DEFTRANS_END;
Avazart
Эксперт С++
7116 / 5293 / 273
Регистрация: 10.12.2010
Сообщений: 23,412
Записей в блоге: 17
19.02.2013, 16:13     Макросы в С++ #4
Цитата Сообщение от chetty Посмотреть сообщение
это упростит понимание кода
Скорее наоборот, в книгах С++ советуют избрать макросов..

Мое мнение что-то в ваших классах не то если такая проблема...
ForEveR
В астрале
Эксперт С++
7970 / 4732 / 320
Регистрация: 24.06.2010
Сообщений: 10,541
Завершенные тесты: 3
19.02.2013, 16:40     Макросы в С++ #5
Avazart, Все как бэ должно быть в меру. Иногда действительно проще написать макрос, а то или не то это уже решает разработчик, вы же не знаете для чего ему это нужно, правда?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.02.2013, 16:44     Макросы в С++
Еще ссылки по теме:

Вложенные макросы - C++
Добрый день. Есть такой макрос: #define QW_QWERTY(data) int testvar = data; #define HELPER2(MACROS, ...) QW_##MACROS __VA_ARGS__ ...

Предопределённые макросы - C++
Всем привет! Скажите кто знает как объяснить компилятору что он работает в Linux или Win32? Я слышал что есть предопределенные макросы, но...

Макросы с аргументами - C++
Напишите программу, содержащую макросы с аргументами, вычисляющие площади различных геометрических фигур (например, квадрата,...

Встроенные макросы - C++
Как заставить работать встроенные макросы? Не отображает! #include &quot;stdafx.h&quot; #include &lt;iostream&gt; using namespace std; int...


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

Или воспользуйтесь поиском по форуму:
Avazart
Эксперт С++
7116 / 5293 / 273
Регистрация: 10.12.2010
Сообщений: 23,412
Записей в блоге: 17
19.02.2013, 16:44     Макросы в С++ #6
Цитата Сообщение от ForEveR Посмотреть сообщение
вы же не знаете для чего ему это нужно, правда?
Поэтому и говорю что может можно обойтись другими средствами ...
К примеру строки заменить enum, сделать класс шаблонным с from и to и использовать typedef
Yandex
Объявления
19.02.2013, 16:44     Макросы в С++
Ответ Создать тему
Опции темы

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