безымянный член структуры

Тема в разделе "LANGS.C", создана пользователем letopisec, 13 ноя 2009.

  1. letopisec

    letopisec New Member

    Публикаций:
    0
    Регистрация:
    8 авг 2004
    Сообщения:
    228
    можно как-нибудь вот так сделать:

    Код (Text):
    1. struct Base
    2. {
    3.      int a;
    4.      int b;
    5. };
    6.  
    7. struct Box
    8. {
    9.     Base;
    10.     int c;
    11.     int d;
    12. };
    13.  
    14. struct ExtendedBox
    15. {
    16.     Box;
    17.     int x;
    18.     int y;  
    19. }
    20.  
    21. main ()
    22. {
    23.     ExtendedBox box = {0};
    24.     box.a = 20;
    25. }
    чтобы без шаблонов и макросов.
     
  2. letopisec

    letopisec New Member

    Публикаций:
    0
    Регистрация:
    8 авг 2004
    Сообщения:
    228
    без шаблонов, макросов и наследования
     
  3. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    Нет. Самый нормальный выход - наследование.
     
  4. J0E

    J0E New Member

    Публикаций:
    0
    Регистрация:
    28 июл 2008
    Сообщения:
    621
    Адрес:
    Panama
    То что выше и есть наследование на языке С.
     
  5. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    J0E

    В плоском си разрешены безымянные поля?
     
  6. cppasm

    cppasm New Member

    Публикаций:
    0
    Регистрация:
    18 июл 2006
    Сообщения:
    923
    Они не разрешены нигде.
    А какой в них смысл? Вообще и в конкретно этом примере.
    Зачем в структуре держать данные, к которым невозможно будет обратиться?
     
  7. J0E

    J0E New Member

    Публикаций:
    0
    Регистрация:
    28 июл 2008
    Сообщения:
    621
    Адрес:
    Panama
    В С99 судя по стандарту и comeau нельзя.
    Но VC компилирует такое
    Код (Text):
    1. typedef struct tagA { int i; } A;
    2. typedef struct tagB { A; int i2; } B;
    3.  
    4. int main()
    5. {
    6.   B b;
    7.   b.i = 0;
    8.   b.i2 = 0;
    9. }
    сталкивался где то в .h микрософфта )
     
  8. o14189

    o14189 New Member

    Публикаций:
    0
    Регистрация:
    19 июл 2009
    Сообщения:
    320
    такое там повсюду, студией собирается без проблем
     
  9. green

    green New Member

    Публикаций:
    0
    Регистрация:
    15 июл 2003
    Сообщения:
    1.217
    Адрес:
    Ukraine
    cppasm
    В некоторых случаях разрешены (Стандартом), и в С, и в С++.
     
  10. letopisec

    letopisec New Member

    Публикаций:
    0
    Регистрация:
    8 авг 2004
    Сообщения:
    228
    cppasm
    ну можно же вот так например:

    Код (Text):
    1. struct ExtendedBox
    2. {
    3.     int x;
    4.     union
    5.     {
    6.         struct
    7.         {
    8.             char a0;
    9.             char a1;
    10.             char a2;
    11.             char a3;
    12.         };
    13.         int a;
    14.     };
    15.     int y;  
    16. }
    17.  
    18. main ()
    19. {
    20.     ExtendedBox box = {0};
    21.     box.a = 20;
    22.     return a0 == a3;
    23. }
    чтобы не делать так: x.uni.struc.a0 == x.uni.struc.a3

    конкретно в этом примере можно было бы:

    1) Создавать структуры из структур (для моей задачи очень уж это подходит), не усложняя способ обращения к полям.
    2) Легким движением руки сдампить такие структуры в файл, чего нельзя добиться используя наследование.
     
  11. letopisec

    letopisec New Member

    Публикаций:
    0
    Регистрация:
    8 авг 2004
    Сообщения:
    228
    3) Я был бы счастлив.
     
  12. reversecode

    reversecode Guest

    Публикаций:
    0
    тема не очем
    я так и не понял чего вы хотите
    спрашивате одно отвечаете другое
    примеры вообще третьи
     
  13. letopisec

    letopisec New Member

    Публикаций:
    0
    Регистрация:
    8 авг 2004
    Сообщения:
    228
    Из того что ты непонял чего я хочу, не следует что тема ни о чем )

    Мне надо нагенерить файлы, в которых лежали бы разные виды структур, которые состоят из других структур + свои данные. Как бы ты решил такую задачу, допустим с вложенностью 10?
    вот так? ExtendedBox box;
    Код (Text):
    1.     box.box.base.a = 20;
    2.     box.box.base.b = 35;
    3.     box.box.c = 42;
    4.     box.box.d = 22;
    5.     box.x = 11;
    6.     box.y = 88;
    7.     fwrite (box, sizeof (box), 1, file);
    А если вложенность 10, и полей чуть побольше?

    Ну или покажи как это реализовать через наследование что бы было так же просто ).
     
  14. letopisec

    letopisec New Member

    Публикаций:
    0
    Регистрация:
    8 авг 2004
    Сообщения:
    228
    кста не пробовал с typedef'ами но мой пример в vс2005 не компиляется.
     
  15. reversecode

    reversecode Guest

    Публикаций:
    0
    вот теперь я в вашем посте просматриваю некоторый вопрос

    мой ответ
    вложеность перекрыветься в больших проектах #define'ами
    а вообще я бы вернулся к сути самой задачи
    возможно там все можно переделать по другому избегая вложеностей вообще
     
  16. letopisec

    letopisec New Member

    Публикаций:
    0
    Регистрация:
    8 авг 2004
    Сообщения:
    228
    define'ы это дело хорошее конечно, но задача стояла чтобы без шаблонов, макросов и наследования.

    Как это сделать define'ами я и сам знаю ).
    А вопрос стоял в моем первом посте вполне конкретный: возможно ли объявить в си безымянный член структуру примерно таким способом как я показал или нет. Поэтому "вернулся к сути задачи" - это offtop. )
     
  17. reversecode

    reversecode Guest

    Публикаций:
    0
    тоесть другими словами вы спрашиваете
    "можно ли на языке С писать языком бейсика или паскаля"

    ответ
    да - возможно
    это называеться извращение
    поэтому вся тема не о чем
    больше в хип чем в язык С
     
  18. J0E

    J0E New Member

    Публикаций:
    0
    Регистрация:
    28 июл 2008
    Сообщения:
    621
    Адрес:
    Panama
    letopisec твой пример не собирается, потому что первым полем должно быть. но если генерируешь файл сам, то почему не "копи-пастить" поля структур генератором?
     
  19. cppasm

    cppasm New Member

    Публикаций:
    0
    Регистрация:
    18 июл 2006
    Сообщения:
    923
    Я мож чего не понимаю, но как безымянная структура тебе поможет?
    Безымянная структура безсмысленна - к её полям нельзя обратиться.
    Безымянный union смысл имеет - он указывает что переменные разделяют одну и ту же область памяти.
    Какой смысл в безымянной структуре я до сих пор не понял.
    Единственное применение - это резервирование места, но тебе надо другое.
    У тебя вопрос по сути такой: как обратиться к полю структуры, не указывая к какому именно.
    Ответ - никак.
    Это специфические случаи, к теме по-моему отношения не имеющие.
     
  20. green5

    green5 New Member

    Публикаций:
    0
    Регистрация:
    5 янв 2006
    Сообщения:
    29
    Адрес:
    Protvino
    Раньше то в С можно было давным давно, сейчас define
    можно типа (фигня конечно)
    class X
    {
    struct a { int a; } t_;
    int &a;
    X():a(t_) {}
    };