Как внутри класса сделать глобальную переменную, видимую из субклассов

Тема в разделе "WASM.BEGINNERS", создана пользователем dyn, 17 дек 2010.

  1. dyn

    dyn New Member

    Публикаций:
    0
    Регистрация:
    30 окт 2009
    Сообщения:
    566
    Привет
    Есть n-ое число классов, которые внутри общего класса. Т.е.:

    Код (Text):
    1. class cWASM
    2. {
    3. int a, b, c, d;
    4.  
    5. cUSERS   users;
    6. cADMINS admins;
    7. cCLERKCLONES clerk_clones;
    8. // ... etc
    9. };
    Как сделать так, чтобы все эти подклассы видели переменные a,b,c,d и могли с ними работать?
    Передавать переменные через сеттеры в каждый подкласс не хотелось бы. Делать их глобальными для всего проекта тоже.
    Есть ли какое-то решение?
     
  2. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    Достаточно передать только cWASM.
     
  3. dyn

    dyn New Member

    Публикаций:
    0
    Регистрация:
    30 окт 2009
    Сообщения:
    566
    а проще?

    Код не мой. Подклассов достаточно много в нем. И в каждом дописывать метод и передавать this не очень красиво, ИМХО...
     
  4. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    По-другому никак. нестед класс он только в пространстве имён другого класса, а бинарно никак с ним не связан, то есть это абсолютно разные типы. Достучатся по аналогии с наследованием тут невозможно.
     
  5. dyn

    dyn New Member

    Публикаций:
    0
    Регистрация:
    30 окт 2009
    Сообщения:
    566
    Ок. Спасибо. Значит буду this передавать
     
  6. Rel

    Rel Well-Known Member

    Публикаций:
    2
    Регистрация:
    11 дек 2008
    Сообщения:
    5.315
    в общем случае класс создается на куче... фактически как выделить структуру из данных класса и всяких в-тейблов с установленным выравниванием... то есть, в принципе, если вложенный класс знает указатель на себя (а он знает), то можно рассчитать расстояние от его указатель до указателя на искомые данные, зная структуру общего класса... то есть для класса cADMINS искомые данные будут лежать:
    Код (Text):
    1. int* pA = (int*)((char*)(this) - sizeof(cUSERS) - 4 * sizeof(int))
    но это во-первых, может и не будет работать, а во-вторых, это - грязный хак, который лучше не использовать...
     
  7. dyn

    dyn New Member

    Публикаций:
    0
    Регистрация:
    30 окт 2009
    Сообщения:
    566
    Rel
    Да ну, вы что :)
    Я пытаюсь уменьшить количества кода, чтобы читаемость была приемлимая и все было более-менее красиво :)
    Хардкорно дергать дворды с хипа не вариант :)
    Уже пишу дополнительные методы для передачи this.

    Всем огромное спасибо!
     
  8. green

    green New Member

    Публикаций:
    0
    Регистрация:
    15 июл 2003
    Сообщения:
    1.217
    Адрес:
    Ukraine
    Код (Text):
    1. cWASM *cUSERS::GetOwner()
    2. {
    3. return (cWASM *)((char *)this - offsetof(cWASM, users));
    4. }
     
  9. AsmGuru62

    AsmGuru62 Member

    Публикаций:
    0
    Регистрация:
    12 сен 2002
    Сообщения:
    689
    Адрес:
    Toronto
    Передача this скорее всего вызовет так называемую circular dependency.
     
  10. CyberManiac

    CyberManiac New Member

    Публикаций:
    0
    Регистрация:
    2 сен 2003
    Сообщения:
    2.473
    Адрес:
    Russia
    Если в проекте начинается такой бардак, нужно дерево классов трясти, а не подпорки ставить. Если надо "быстро и грязно", перепиши конструкторы вложенных классов, чтобы у них был строго один параметр - ссылка на экземпляр класса-владельца, а потом компили и начинай править синтаксические ошибки.