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

Что делают две решетки в макроссе? - C++

Восстановить пароль Регистрация
 
ninja2
 Аватар для ninja2
230 / 186 / 7
Регистрация: 26.09.2012
Сообщений: 2,018
Завершенные тесты: 1
11.07.2015, 12:34     Что делают две решетки в макроссе? #1
Есть макрос:
C++
1
#define _RUNTIME_CLASS(class_name) ((CRuntimeClass*)(&class_name::class##class_name))
Что делают две решетки в макроссе?
Например мы вызываем для класса my_class и что получается?
C++
1
((CRuntimeClass*)(&my_class::class##my_class))
Получается указатель и на что две решетки заменяются?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
0x10
2437 / 1609 / 235
Регистрация: 24.11.2012
Сообщений: 3,949
11.07.2015, 12:36     Что делают две решетки в макроссе? #2
Конкатенация:
C++
1
((CRuntimeClass*)(&my_class::classmy_class))
В чем проблема загуглить/проверить самому?
ninja2
 Аватар для ninja2
230 / 186 / 7
Регистрация: 26.09.2012
Сообщений: 2,018
Завершенные тесты: 1
11.07.2015, 12:58  [ТС]     Что делают две решетки в макроссе? #3
Цитата Сообщение от 0x10 Посмотреть сообщение
Конкатенация:
Код C++
Выделить код
1
((CRuntimeClass*)(&my_class::classmy_class))
В чем проблема загуглить/проверить самому?
И что это получается? Типо такой член должен быть в классе?
А что означает одна решетка, от код макроса, я значения поподставлял, хочу посмотреть что получится
C++
1
2
3
4
5
AFX_COMDAT const CRuntimeClass CSpaceship::class##CSpaceship = { 
        #CSpaceship, sizeof(class CSpaceship), 0xFFFF, CSpaceship::CreateObject, 
        ((CRuntimeClass*)(&CCmdTarget::class##CCmdTarget)), NULL, NULL }; 
    CRuntimeClass* class_name::GetRuntimeClass() const 
        { return ((CRuntimeClass*)(&CSpaceship::class##CSpaceship));}
Добавлено через 5 минут
И что это &my_class::classmy_class означает? Обращение к статическому члену класса my_class?

Добавлено через 3 минуты
Читал что одинарная решетка - это кавычки, получается тогда макросс:
C++
1
2
3
4
5
6
7
#define IMPLEMENT_RUNTIMECLASS(class_name, base_class_name, wSchema, pfnNew, class_init) \
 
    __declspec(selectany) const CRuntimeClass CSpaceship::classCSpaceship = { 
        "CSpaceship", sizeof(class CSpaceship), 0xFFFF, CSpaceship::CreateObject, 
        ((CRuntimeClass*)(&CCmdTarget::classCCmdTarget)), NULL, NULL }; 
    CRuntimeClass* CSpaceship::GetRuntimeClass() const 
        { return ((CRuntimeClass*)(&CSpaceship::classCSpaceship));}
Только я не пойму что он делает
hoggy
5420 / 2219 / 410
Регистрация: 15.11.2014
Сообщений: 4,984
Завершенные тесты: 1
11.07.2015, 12:59     Что делают две решетки в макроссе? #4
Цитата Сообщение от ninja2 Посмотреть сообщение
И что это получается? Типо такой член должен быть в классе?
типо да.

Цитата Сообщение от ninja2 Посмотреть сообщение
А что означает одна решетка
литерная константа.

пример использования:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <iostream>
 
 
 
#define dDEBUG(val) \
    std::cout<< #val << " = " << val <<std::endl;
 
int main()
{
    std::cout << "Hello, world!\n";
    
    int value = 33;
    
    dDEBUG(value);
    
}
вывод:
Hello, world!
value = 33
ninja2
 Аватар для ninja2
230 / 186 / 7
Регистрация: 26.09.2012
Сообщений: 2,018
Завершенные тесты: 1
11.07.2015, 13:20  [ТС]     Что делают две решетки в макроссе? #5
А что этот код означает?
C++
1
2
3
__declspec(selectany) const CRuntimeClass CSpaceship::classCSpaceship = { 
        "CSpaceship", sizeof(class CSpaceship), 0xFFFF, CSpaceship::CreateObject, 
        ((CRuntimeClass*)(&CCmdTarget::classCCmdTarget)), NULL, NULL };
Что здесь происходит, создается класс CRuntimeClass со членом класса CSpaceship::classCSpaceship, а что это в фигурных скобках за фигня неясная? Я такой синтаксис первый раз вижу, что это такое?

Добавлено через 3 минуты
Могу подсказать CRuntimeClass - это структура, получается в фигурных скобках например такое
C++
1
CRuntimeClass p={"dd","dddd","cvdadf"};
Это типо определение структуры?
Вообще синтаксис не ясный, первый раз такой вижу

Добавлено через 2 минуты
Вот определение CRuntimeClass, мб. вам поможет разобраться что да как

Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
struct CRuntimeClass
{
// Attributes
    LPCSTR m_lpszClassName;
    int m_nObjectSize;
    UINT m_wSchema; // schema number of the loaded class
    CObject* (PASCAL* m_pfnCreateObject)(); // NULL => abstract class
#ifdef _AFXDLL
    CRuntimeClass* (PASCAL* m_pfnGetBaseClass)();
#else
    CRuntimeClass* m_pBaseClass;
#endif
 
// Operations
    CObject* CreateObject();
    BOOL IsDerivedFrom(const CRuntimeClass* pBaseClass) const;
 
    // dynamic name lookup and creation
    static CRuntimeClass* PASCAL FromName(LPCSTR lpszClassName);
    static CRuntimeClass* PASCAL FromName(LPCWSTR lpszClassName);
    static CObject* PASCAL CreateObject(LPCSTR lpszClassName);
    static CObject* PASCAL CreateObject(LPCWSTR lpszClassName);
 
// Implementation
    void Store(CArchive& ar) const;
    static CRuntimeClass* PASCAL Load(CArchive& ar, UINT* pwSchemaNum);
 
    // CRuntimeClass objects linked together in simple list
    CRuntimeClass* m_pNextClass;       // linked list of registered classes
    const AFX_CLASSINIT* m_pClassInit;
};


Добавлено через 6 минут
Вообще никак не пойму зачем этот макрос IMPLEMENT_RUNTIMECLASS нужен и как его использовать в программах?
hoggy
5420 / 2219 / 410
Регистрация: 15.11.2014
Сообщений: 4,984
Завершенные тесты: 1
11.07.2015, 13:26     Что делают две решетки в макроссе? #6
в классе CSpaceship есть поле по имени classCSpaceship ,
имеющее тип const CRuntimeClass,
и инициализирующееся подобно структуре, при помощи { ... }
ninja2
 Аватар для ninja2
230 / 186 / 7
Регистрация: 26.09.2012
Сообщений: 2,018
Завершенные тесты: 1
11.07.2015, 14:17  [ТС]     Что делают две решетки в макроссе? #7
Цитата Сообщение от hoggy Посмотреть сообщение
в классе CSpaceship есть поле по имени classCSpaceship ,
имеющее тип const CRuntimeClass,
Ну да в класс добавляем макрос DECLARE_DYNCREATE(CSpaceship) и он добавляет в класс static const CRuntimeClass c именем classCSpaceship и два объявления функций одну статическую static CObject* PASCAL CreateObject(); и другую виртуальную virtual CRuntimeClass* GetRuntimeClass() const;, этим функциям дает определение вне класса макросс IMPLEMENT_DYNCREATE в котором функция
C++
1
2
CObject* PASCAL class_name::CreateObject() 
        { return new class_name; }
и вызов макроса IMPLEMENT_RUNTIMECLASS - а он уже делает инициализацию структуры CRuntimeClass и дает определения функции GetRuntimeClass.
Щас попробую на практике их поиспользовать!

А на деле что лучше использовать эти макросы да? Эти макросы используются вместо new и dynamic_cast вроде, типо их лучше использовать хз. ниче не ясно с этими макросами, темный лес

Добавлено через 2 минуты
В любом классе поражденном от CObject находится структура CRuntimeClass в которой находится информация о классе
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.07.2015, 17:02     Что делают две решетки в макроссе?
Еще ссылки по теме:

C++ Объясните что делают эти команды
C++ Необходимо описать модули. Т.е что они делают
Объясните пожалуйста что делают выделенные строки C++
C++ Подскажите что делают эти функции
C++ Описать строчки кода, что они делают!

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

Или воспользуйтесь поиском по форуму:
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16933 / 5338 / 328
Регистрация: 30.03.2009
Сообщений: 14,339
Записей в блоге: 26
12.07.2015, 17:02     Что делают две решетки в макроссе? #8
http://www.cyberforum.ru/blogs/18334/blog100.html
Yandex
Объявления
12.07.2015, 17:02     Что делают две решетки в макроссе?
Ответ Создать тему
Опции темы

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