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

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

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

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

18.02.2013, 13:41. Просмотров 889. Ответов 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;
}
Помогите информацией, пожалуйста
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
18.02.2013, 13:41
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Макросы в С++ (C++):

макросы - 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() ...

5
lemegeton
2927 / 1356 / 136
Регистрация: 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;
0
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;
0
Avazart
Эксперт С++
7433 / 5472 / 310
Регистрация: 10.12.2010
Сообщений: 24,396
Записей в блоге: 17
19.02.2013, 16:13 #4
Цитата Сообщение от chetty Посмотреть сообщение
это упростит понимание кода
Скорее наоборот, в книгах С++ советуют избрать макросов..

Мое мнение что-то в ваших классах не то если такая проблема...
0
ForEveR
В астрале
Эксперт С++
7986 / 4745 / 321
Регистрация: 24.06.2010
Сообщений: 10,547
Завершенные тесты: 3
19.02.2013, 16:40 #5
Avazart, Все как бэ должно быть в меру. Иногда действительно проще написать макрос, а то или не то это уже решает разработчик, вы же не знаете для чего ему это нужно, правда?
0
Avazart
Эксперт С++
7433 / 5472 / 310
Регистрация: 10.12.2010
Сообщений: 24,396
Записей в блоге: 17
19.02.2013, 16:44 #6
Цитата Сообщение от ForEveR Посмотреть сообщение
вы же не знаете для чего ему это нужно, правда?
Поэтому и говорю что может можно обойтись другими средствами ...
К примеру строки заменить enum, сделать класс шаблонным с from и to и использовать typedef
0
19.02.2013, 16:44
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.02.2013, 16:44
Привет! Вот еще темы с ответами:

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Опции темы

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