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

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

Восстановить пароль Регистрация
 
chetty
0 / 0 / 0
Регистрация: 18.02.2013
Сообщений: 8
18.02.2013, 13:41     Макросы в С++ #1
Доброго времени суток. Подскажите, где можно почитать про написание макросов для классов?

У меня есть класс
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++
C++ Макросы
Макросы C++
C++ макросы
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
lemegeton
 Аватар для lemegeton
2909 / 1338 / 133
Регистрация: 29.11.2010
Сообщений: 2,720
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
 Аватар для Avazart
6899 / 5139 / 252
Регистрация: 10.12.2010
Сообщений: 22,579
Записей в блоге: 17
19.02.2013, 16:13     Макросы в С++ #4
Цитата Сообщение от chetty Посмотреть сообщение
это упростит понимание кода
Скорее наоборот, в книгах С++ советуют избрать макросов..

Мое мнение что-то в ваших классах не то если такая проблема...
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
19.02.2013, 16:40     Макросы в С++ #5
Avazart, Все как бэ должно быть в меру. Иногда действительно проще написать макрос, а то или не то это уже решает разработчик, вы же не знаете для чего ему это нужно, правда?
Avazart
 Аватар для Avazart
6899 / 5139 / 252
Регистрация: 10.12.2010
Сообщений: 22,579
Записей в блоге: 17
19.02.2013, 16:44     Макросы в С++ #6
Цитата Сообщение от ForEveR Посмотреть сообщение
вы же не знаете для чего ему это нужно, правда?
Поэтому и говорю что может можно обойтись другими средствами ...
К примеру строки заменить enum, сделать класс шаблонным с from и to и использовать typedef
Yandex
Объявления
19.02.2013, 16:44     Макросы в С++
Ответ Создать тему
Опции темы

Текущее время: 16:25. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru