Легенда:
   новое сообщение
    закрытая нитка
    новое сообщение
    в закрытой нитке
    старое сообщение
         
		 | 
- Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
 - Новичкам также крайне полезно ознакомиться с данным документом.
   
Как бы половчее реализовать на С++ класс, аналогичный java enum?  08.01.19 11:50  
 Автор: Zef <Alloo Zef> Статус: Elderman
 | 
 
| 
В идеале бы так, чтобы все его экземпляры тащить из java в С копипастом.
 | 
 
 
  |   | 
Это "штучный" класс, а вот, как бы создать шаблон  10.01.19 09:18  
 Автор: Zef <Alloo Zef> Статус: Elderman
 | 
 
> https://stackoverflow.com/questions/1965249/how-to-write-a- аналогичный Жабовскому
 public enum Planet {
     MERCURY (3.303e+23, 2.4397e6),
     VENUS   (4.869e+24, 6.0518e6),
     EARTH   (5.976e+24, 6.37814e6),
     MARS    (6.421e+23, 3.3972e6),
     JUPITER (1.9e+27,   7.1492e7),
     SATURN  (5.688e+26, 6.0268e7),
     URANUS  (8.686e+25, 2.5559e7),
     NEPTUNE (1.024e+26, 2.4746e7);
 
     private final double mass;   // in kilograms
     private final double radius; // in meters
     Planet(double mass, double radius) {
         this.mass = mass;
         this.radius = radius;
     }
 А нечто подобное описанному я уже сляпал... Это-то очевидно.
 | 
 
 
  |   |   | 
error C2059: syntax error : 'constant'  13.01.19 09:06  
 Автор: Zef <Alloo Zef> Статус: Elderman
 | 
 
Горит мой деревянный москlll
 Короче, сделал вот так:
 #include "Enum.h"
 #include "Item.h"
 
 static class ItemType : public CEnum  
 {
 public:
 	ItemType();
 	virtual ~ItemType();
 
 
     CItem TYPE_STRING_ID_ITEM(            0x0001, 0,  4, "string_id_item");
     CItem TYPE_TYPE_ID_ITEM(              0x0002, 1,  4, "type_id_item");
     CItem TYPE_PROTO_ID_ITEM(             0x0003, 2,  4, "proto_id_item");
     CItem TYPE_FIELD_ID_ITEM(             0x0004, 3,  4, "field_id_item");
     CItem TYPE_METHOD_ID_ITEM(            0x0005, 4,  4, "method_id_item");
     CItem TYPE_CLASS_DEF_ITEM(            0x0006, 5,  4, "class_def_item");
     CItem TYPE_MAP_LIST(                  0x1000, 16, 4, "map_list");
     CItem TYPE_TYPE_LIST(                 0x1001, 6,  4, "type_list");
     CItem TYPE_ANNOTATION_SET_REF_LIST(   0x1002, 7,  4, "annotation_set_ref_list");
     CItem TYPE_ANNOTATION_SET_ITEM(       0x1003, 8,  4, "annotation_set_item");
     CItem TYPE_CLASS_DATA_ITEM(           0x2000, 9,  1, "class_data_item");
     CItem TYPE_CODE_ITEM(                 0x2001, 10, 4, "code_item");
     CItem TYPE_STRING_DATA_ITEM(          0x2002, 11, 1, "string_data_item");
     CItem TYPE_DEBUG_INFO_ITEM(           0x2003, 12, 1, "debug_info_item");
     CItem TYPE_ANNOTATION_ITEM(           0x2004, 13, 1, "annotation_item");
     CItem TYPE_ENCODED_ARRAY_ITEM(        0x2005, 14, 1, "encoded_array_item");
     CItem TYPE_ANNOTATIONS_DIRECTORY_ITEM(0x2006, 15, 4, "annotations_directory_item");
 };
 Соответственно, создал CEnum и CItem c как бы я тайпы не переименовывал, как бы я не переписывал аргументы и что бы не менял в конструкторе получаю error C2059: syntax error : 'constant'.
 Кака исчезает только, если конструктор делаю без аргументов.
 | 
 
 
  |   |   |   | 
В .h не возможно инициализировать объекты.  19.01.19 06:13  
 Автор: Zef <Alloo Zef> Статус: Elderman
 | 
 
А если я их объявлю в .cpp, то они только там видны и будут. Как это разрулить так, чтобы было типа 
 CItem TYPE_STRING_ID_ITEM( 0x0001, 0, 4, "string_id_item");  и этот TYPE_STRING_ID_ITEM был доступен из других модулей
 | 
 
 
  |   |   |   |   | 
В Си и C++ существует такое понятие, как "единица компиляции"  04.06.19 19:17  
 Автор: Den <Денис Т.> Статус: The Elderman Отредактировано 06.06.19 11:31  Количество правок: 1
 | 
 
То, что объявлено внутри единицы компиляции, существует только там, а из других единиц компиляции ты можешь получить доступ к тому, что объявил через включение.
 
 Заголовочные файлы также являются единицами компиляции и если ты объявил как static с инициализацией некий синглетон, то к нему, так или иначе, можно получить доступ. Например, в заголовочном файле ты можешь объявить:
 static
TYPE_STRING_ID_ITEM* getStringItem1()
(
  static
  TYPE_STRING_ID_ITEM *instance = NULL;
  if (NULL == instance)
    instance = new TYPE_STRING_ID_ITEM( 0x0001, 0, 4, "string_id_item");
  return instance;
)  ---
 Экземпляр как переменной типа TYPE_STRING_ID_ITEM, так и возвращающей ссылку на неё функции, находящихся в заголовочном файле, будет только один для всех .cpp файлов, что будут включать этот заголовочный файл.
 | 
 
 
  |   |   |   |   |   | 
Хорошую вещь начал, но сил не хватило закончить...  24.08.20 04:06  
 Автор: Zef <Alloo Zef> Статус: Elderman
 | 
 
Уже и забыл, что делал! А делал-то ведь Dex-едитор на С.
 
 Суть, родная гугловая либа сборки-разборки Dex-файлов спотыкается на загогулинах порождаемых обфускатором. Разобрать можно, посмотреть можно, а собрать обратно - хрен! А, если патчить не разбирая? Как ехе-шники патчат в гексе? Надо  только разобрать поля Dexа по полочкам, найти, декомпилить и поправить нужный фрагмент. Вот, это я сделать и хотел, для чего и пытался Dex-либу портировать в С, да малость вспотел...
 | 
 
 
  |   |   |   |   | 
как с любой другой переменной  21.02.19 19:12  
 Автор: dl <Dmitry Leonov> 
 | 
 
> А если я их объявлю в .cpp, то они только там видны и > будут. Как это разрулить так, чтобы было типа  > CItem TYPE_STRING_ID_ITEM( 0x0001, 0, 4, "string_id_item"); >  и этот TYPE_STRING_ID_ITEM был доступен из других модулей 
 Инициализировать в одном файле, в другом объявлять как extern.
 | 
 
 
  |   |   |   |   | 
Хвост древнего С  20.01.19 05:45  
 Автор: Zef <Alloo Zef> Статус: Elderman Отредактировано 20.01.19 05:46  Количество правок: 1
 | 
 
| 
Разобрался в чем дело: это хвост дообъектной эры. Компоновщик умеет предотвращать повторные объявления переменных при многократном инклюде хедера, но не умеет предотвращать повторную инициализацию. Потому можно объявлять в хедере только те объекты, у которых конструктор не имеет параметров. Хреново...
 | 
 
 
  
 
 | 
 |