LINUX.ORG.RU
 

[c++] forward declaration для подструктуры.


0

1

Можно конечно поменять местами декларации B и A, но хотелось бы сохранить такой порядок. Вопрос - как?

struct B;
struct B::C;

struct A {
  typedef B::C DataPtr;
  DataPtr c;
};

struct B {
  struct C {
    int ololo;
  };
  ...
};
Такое мой фю^W^W компилятор отказывается проглатывать. Причина по которой не нравится менять местами декларации: структуре B может понадобиться подструктура A - получаем пиздец.

P.S. никому не кажется лишним правило о строгом порядке объявления?


[#] Ответ на: [c++] forward declaration для подструктуры. от l5k 24.11.2009 13:06:46  
lester_dev

[c++] forward declaration для подструктуры.

>Можно узнать критерии нормальности дизайна или это как обычно - слепейший субъективизм?

жирный_поезд_пассажирный.jpg

Похоже, автор топика пришел не советов спросить, а развести флейм на пустом месте. И это хорошо :B

***** ()
[#] Ответ на: [c++] forward declaration для подструктуры. от l5k 24.11.2009 13:06:46  

[c++] forward declaration для подструктуры.

>> а ты думаешь, что это нормальный дизайн, когда из B::C ты используешь А, полем которой B::C является?

> Эмм... да, а что?

> Можно узнать критерии нормальности дизайна или это как обычно - слепейший субъективизм?

конечно, субъективизм. тебя вообще чему учили в ВУЗе? Ты мне скажи, зачем структуру/класс C, которая непосредственно используется из структуры/класса А, делать вложенным в структуру/класс B? Это разве не бред? Это вообще может работать предсказуемо?

** ()
[#] Ответ на: [c++] forward declaration для подструктуры. от name_no 24.11.2009 13:17:03  

[c++] forward declaration для подструктуры.

> тебя вообще чему учили в ВУЗе?
Учиться.

> Ты мне скажи, зачем структуру/класс C, которая непосредственно используется из структуры/класса А, делать вложенным в структуру/класс B?

Специфика задачи. Если конкретней, то каждому вышеприведённому Object\d* соответствует своя таблица в БД. При некоторых условиях Object1 надо втыкать в таблицу для Object2. Такие дела.

> Это разве не бред?

Нет.

> Это вообще может работать предсказуемо?

Ещё как!

()
[#] Ответ на: [c++] forward declaration для подструктуры. от l5k 24.11.2009 13:32:31  

[c++] forward declaration для подструктуры.

а так почему нельзя?

struct A;

struct B {
  struct C {
    int ololo;
  };
  ...
};

struct A {
  typedef B::C DataPtr;
  DataPtr c;
};

** ()
[#] Ответ на: [c++] forward declaration для подструктуры. от l5k 24.11.2009 14:21:49  

[c++] forward declaration для подструктуры.

> Читай первое сообщение.

>> Причина по которой не нравится менять местами декларации: структуре B может понадобиться подструктура A - получаем пиздец.

если тебе не нужна A::D, то проблемы нет.

** ()
[#] Ответ на: [c++] forward declaration для подструктуры. от name_no 24.11.2009 14:26:25  

[c++] forward declaration для подструктуры.

> А если нужна - открывай Страуструпа и читай до просветления.

Неужели Страуструп просветляет? Ты можешь поделиться частичкой света его ума?

()
[#] Ответ на: [c++] forward declaration для подструктуры. от name_no 24.11.2009 14:25:42  

[c++] forward declaration для подструктуры.

> если тебе не нужна A::D, то проблемы нет.

Совершенно недальновидно.

()
[#] Ответ на: [c++] forward declaration для подструктуры. от l5k 24.11.2009 14:33:41  

[c++] forward declaration для подструктуры.

>> А если нужна - открывай Страуструпа и читай до просветления.

> Неужели Страуструп просветляет? Ты можешь поделиться частичкой света его ума?

конечно, не могу.

** ()
[#] Ответ на: [c++] forward declaration для подструктуры. от name_no 24.11.2009 14:36:10  

[c++] forward declaration для подструктуры.

>>> А если нужна - открывай Страуструпа и читай до просветления.

>> Неужели Страуструп просветляет? Ты можешь поделиться частичкой света его ума?

> конечно, не могу.

Стало быть, ты и сам не просветился?

()
[#] Ответ на: [c++] forward declaration для подструктуры. от l5k 24.11.2009 14:37:56  

[c++] forward declaration для подструктуры.

>> конечно, не могу.

> Стало быть, ты и сам не просветился?

нет, просто ты мне надоел.

** ()
[#] Ответ на: [c++] forward declaration для подструктуры. от name_no 24.11.2009 14:55:53  

[c++] forward declaration для подструктуры.

>>> конечно, не могу.

>> Стало быть, ты и сам не просветился?

> нет, просто ты мне надоел.

Будто мне не надоели всякого рода крестофилы. (:

()
[#] Ответ на: [c++] forward declaration для подструктуры. от l5k 24.11.2009 15:03:55  

[c++] forward declaration для подструктуры.

> Будто мне не надоели всякого рода крестофилы. (:

и не говори, мы сами себе порой так надоедаем - ужас просто

**** ()
[#] Ответ на: [c++] forward declaration для подструктуры. от l5k 24.11.2009 15:03:55  

[c++] forward declaration для подструктуры.

> Будто мне не надоели всякого рода крестофилы. (:

ты же их сам в этот тред кастуешь

** ()
[#] Ответ на: [c++] forward declaration для подструктуры. от l5k 24.11.2009 15:03:55  
lester_dev

[c++] forward declaration для подструктуры.

>Будто мне не надоели всякого рода крестофилы. (:

кстати, пиши на C#, там есть partial классы, ничто не мешает объявить половину класса B до класса A, а остальную часть - после.

***** ()
[#] Ответ на: [c++] forward declaration для подструктуры. от lester_dev 24.11.2009 16:25:58  

[c++] forward declaration для подструктуры.

Думается мне что на вечно догоняющем Mono писать не стоит.
Уж лучше erlang/ruby/lisp/blabla. Первое - оч подходит для моей задачи (не топиковой, а вообще).

()
[#] Ответ на: [c++] forward declaration для подструктуры. от l5k 24.11.2009 11:54:57  

Re: [c++] forward declaration для подструктуры.

>struct Object1;
>struct Object1::Data;

>struct Object2;

>struct Object2::Data;

>struct Object1

>{ struct Data { ... };

> Data *d1;

> Object2::Data *d2; };

>struct Object2

>{ struct Data { ... };

> Data *d2; };


ох, 2.71-ать, код-3.41-ец.
даже в Qt используется второй вариант. причем без всяких typedef Object1Data Data;
ибо код в таком случае нагляднее и очевиднее.

короче, еще одно быдлоподелие в блэклист.

** ()
[#] Ответ на: Re: [c++] forward declaration для подструктуры. от xydo 24.11.2009 18:17:47  

[c++] forward declaration для подструктуры.

А ты, видать, и файловую систему используешь такого вида:
/var
/varlib
/varlibhal
/varcache

Да? "Нагляднее и очевиднее" же.

()
[#] Ответ на: [c++] forward declaration для подструктуры. от l5k 25.11.2009 7:55:57  

[c++] forward declaration для подструктуры.

> А ты, видать, и файловую систему используешь такого вида:

вот как раз это твой случай - когда ты хочешь увидеть только корень ФС, а тебе вместе с var, например, до кучи выдают все дочерние директории

**** ()
[#] Ответ на: [c++] forward declaration для подструктуры. от lester 25.11.2009 8:00:10  

[c++] forward declaration для подструктуры.

Мой случай подобен симлинку /var/dir1/data -> /var/dir2/data.
Не морочь мне бабушку.

()
[#] Ответ на: [c++] forward declaration для подструктуры. от l5k 25.11.2009 8:08:33  

[c++] forward declaration для подструктуры.

> Мой случай подобен симлинку /var/dir1/data -> /var/dir2/data.

"симлинк" был бы при typedef, а так у тебя такой код, что при желании посмотреть дочерние поля структуры прийдется заодно пробежаться по вложенным структурам

**** ()
[#] Ответ на: [c++] forward declaration для подструктуры. от lester 25.11.2009 8:11:55  

[c++] forward declaration для подструктуры.

> "симлинк" был бы при typedef

Он же есть там. %)

> при желании посмотреть дочерние поля структуры прийдется заодно пробежаться по вложенным структурам

Ничто не мешает оставить предобъявление и объявить подструктуры ниже. Это хотя бы разрешено стандартом, слава Страуструпу.

Суть-то та же: в глобальном пространстве имён не будет подструктур. Мапирую на ФС:

Object1       => /dir1
Object1Data   => /dir1data
Object1::Data => /dir1/data
Object2Data   => /dir2data
Object2::Data => /dir2/data
typedef Object2::Data Object1::ElseData => /dir1/else-data -> /dir2/data
typedef Object2Data   Object1::ElseData => /dir1/else-data -> /dir2data
typedef Object2Data   Object1ElseData   => /dir1else-data  -> /dir2data
Так понятней?

()
[#] Ответ на: [c++] forward declaration для подструктуры. от l5k 25.11.2009 7:55:57  

[c++] forward declaration для подструктуры.

не совсем так.
скорее что-то типа такого: /var/varlog/varlogmessages
в любом случае не страдай СПГС...

** ()