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. никому не кажется лишним правило о строгом порядке объявления?


Ответ на: комментарий от l5k

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

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

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

lester_dev ★★★★★
()
Ответ на: комментарий от l5k

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

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

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

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

name_no ★★
()
Ответ на: комментарий от name_no

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

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

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

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

Нет.

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

Ещё как!

l5k
() автор топика
Ответ на: комментарий от l5k

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

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

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

name_no ★★
()
Ответ на: комментарий от name_no

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

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

l5k
() автор топика
Ответ на: комментарий от name_no

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

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

l5k
() автор топика
Ответ на: комментарий от l5k

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

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

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

name_no ★★
()
Ответ на: комментарий от name_no

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

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

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

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

l5k
() автор топика
Ответ на: комментарий от name_no

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

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

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

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

l5k
() автор топика
Ответ на: комментарий от l5k

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

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

lester ★★★★
()
Ответ на: комментарий от l5k

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

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

lester_dev ★★★★★
()
Ответ на: комментарий от lester_dev

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

l5k
() автор топика
Ответ на: комментарий от l5k

>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;
ибо код в таком случае нагляднее и очевиднее.

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

xydo ★★
()
Ответ на: комментарий от xydo

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

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

l5k
() автор топика
Ответ на: комментарий от l5k

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

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

lester ★★★★
()
Ответ на: комментарий от l5k

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

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

lester ★★★★
()
Ответ на: комментарий от lester

«симлинк» был бы при 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
Так понятней?

l5k
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.