Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.55/11: Рейтинг темы: голосов - 11, средняя оценка - 4.55
0 / 0 / 0
Регистрация: 27.09.2016
Сообщений: 9
1

Typedef участвующий в создании класса

22.10.2016, 15:02. Показов 2035. Ответов 18
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
нашел вот такой фрагмент кода в релизных исходниках одного известного сайта

C++
1
2
3
4
5
typedef struct 
{ 
float time; // time in seconds 
float position[3]; // local position 
} ms3d_keyframe_pos_t;
Мне только непонятно почему не

C++
1
2
3
4
5
struct ms3d_keyframe_pos_t 
{ 
float time; // time in seconds 
float position[3]; // local position 
} ;
Какие у этого способа преимущества?...есть ли плюсы или минусы....
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
22.10.2016, 15:02
Ответы с готовыми решениями:

Объект не участвующий в рендеринге, но участвующий в столкновениях
Приветствую. Подскажите, пожалуйста, такой шейдер, чтобы объект не участвовал в рендеринге, а...

Typedef внутри класса
Добрый день! Прошу помочь с одно маленькой вещью. Есть класс class Application{...

Изменить поле класса используя typedef
Есть такая возможность? typedef std::pair<int, int>::first i; typedef std::pair<int,...

Указатель на шаблон класса через typedef
Здравствуйте. Возникла следующая проблема: захотел определить указатель на класс с template при...

18
7789 / 6556 / 2984
Регистрация: 14.04.2014
Сообщений: 28,661
22.10.2016, 15:26 2
Первое - древний синтаксис языка C, а второе - по-современному.
1
0 / 0 / 0
Регистрация: 27.09.2016
Сообщений: 9
22.10.2016, 15:42  [ТС] 3
nmcf, спасибо...
Мне не пришлось столкнуться с чистым c, так что я не знал.
Спасибою
0
Вездепух
Эксперт CЭксперт С++
11694 / 6373 / 1723
Регистрация: 18.10.2014
Сообщений: 16,057
22.10.2016, 17:59 4
Лучший ответ Сообщение было отмечено DrOffset как решение

Решение

Цитата Сообщение от werarray01 Посмотреть сообщение
Какие у этого способа преимущества?
Ничего "древнего" тут нет. Оба синтаксиса являются одинаково древними и одинаково современными. Оба синтаксиса корректны и в С, и в С++, однако ведут себя по-разному.

* В первом случае и на территории С кода, и на территории С++ кода будет создан тип по имени ms3d_keyframe_pos_t.

* Во втором случае на территории С кода будет создан тип по имени строго struct ms3d_keyframe_pos_t, а не территории С++ кода его можно будет называть как struct ms3d_keyframe_pos_t так и просто ms3d_keyframe_pos_t.

По этой причине в чисто С++ программе первый вариант не имеет смысла - он ничего не дает, а только удлиняет определение типа.

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

C
1
2
3
4
5
typedef struct ms3d_keyframe_pos_t
{ 
  float time; // time in seconds 
  float position[3]; // local position 
} ms3d_keyframe_pos_t;
Поэтому первый вариант имеет смысл фактически только в заголовочных файлах, который планируется использовать в смешанной С и С++ программе на территории и С, и С++ кода, когда автор хочет ссылаться на тип именно коротким именем ms3d_keyframe_pos_t. Однако и в этом случае я бы дал структуре тэг, как показано в моем варианте.
1
7789 / 6556 / 2984
Регистрация: 14.04.2014
Сообщений: 28,661
22.10.2016, 18:55 5
TheCalligrapher, ну как нет? Дописывание struct во всех ссылках на тип было именно в древние времена, а typedef позволял не писать struct. В C++ typedef применительно к struct не имеет смысла, только для создания псевдонимов.
0
Вездепух
Эксперт CЭксперт С++
11694 / 6373 / 1723
Регистрация: 18.10.2014
Сообщений: 16,057
22.10.2016, 19:33 6
Цитата Сообщение от nmcf Посмотреть сообщение
Дописывание struct во всех ссылках на тип было именно в древние времена, а typedef позволял не писать struct.
Не понимаю, о чем речь. Какие еще "древние времена"???

Дописывание struct во всех ссылках на struct-тип - классическое фундаментальное свойство языка С. Оно всегда было в С и всегда будет в С. Ничего в этом отношении в С никогда не менялось и ничего "древнего" в этом нет. Современный С ничем не отличается в этом отношении от оригинального С.

Если вам не нравится везде дописывать struct в С, вы можете использовать typedef для создания более короткого псевдонима для struct-типа. Опять же так было в С всегда и в современном С никаких изменений тут не произошло.

При этом в С коде это чисто вопрос стиля: кто-то любит всегда безусловно создавать более короткие псевдонимы для всех struct-типов (см. мой пример), а кто-то считает, что этого делать не стоит, а надо везде явно писать struct при ссылке struct-тип. Никто не связывает последний вариант ни с какой "древностью", а объясняет его просто нежеланием скрывать struct-овую природу типа за typedef-именем.

Так что ни с точки зрения синтаксиса языка, ни с точки зрения стилистических соображений ничего "древнего" тут нет и в помине. Откуда вы это взяли - мне не ясно. Если и искать тут какой-то водораздел, то проходит он скорее по линии С vs. С++, а не по линии "древний" vs. "современный".

Тут можно только добавить, еще раз, что использование безтагового типа в первом случае многие (включая меня) сочтут порочной практикой. Такое чаще всего встречается в коде у новичков. Даже при использовании typedef имеет смысл дать struct-типу таг, как показано в моем примере.
0
1379 / 406 / 144
Регистрация: 22.10.2014
Сообщений: 872
22.10.2016, 19:56 7
werarray01,
И до кучи:
C++
1
2
3
4
5
6
7
8
9
10
11
struct Type
{
};
 
int main()
{
    int Type;
    Type type1;//error
    struct Type type2;// ok
    struct Type2* type2_1;// ok :)
}
Сия штука в плюсах называется Elaborated type specifier.
0
Неэпический
17870 / 10635 / 2054
Регистрация: 27.09.2012
Сообщений: 26,736
Записей в блоге: 1
22.10.2016, 19:58 8
Nosey, как это относится к typedef?
Речь же о typedef, а не о struct/class.
0
1379 / 406 / 144
Регистрация: 22.10.2014
Сообщений: 872
22.10.2016, 20:10 9
Цитата Сообщение от Croessmah Посмотреть сообщение
как это относится к typedef?
Именно к typedef, никак . Ну разве что вот так, отношение налицо :
C++
1
2
3
4
int main()
{
    typedef struct Type Type1;
}
А к вопросу ТС, самое косвенное отношение: Если что-то было в С, то как это что-то обыгрывается в С++?
0
Croessmah
22.10.2016, 20:14
  #10

Не по теме:

Цитата Сообщение от Nosey Посмотреть сообщение
Если что-то было в С, то как это что-то обыгрывается в С++?
Смотря о чем речь. Вот, это, например:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <stdio.h>
 
void bar ( x ) int x ; {
   printf ( "%d" , x ) ;
}
 
void foo ( ) {
}
 
 
int main  ( ) {
   foo ( 55 ) ;
   bar ( 44 ) ;
   return 0 ;
}
обыграется как ошибка в C++. :D

0
Nosey
22.10.2016, 20:19
  #11

Не по теме:

Цитата Сообщение от Croessmah Посмотреть сообщение
обыграется как ошибка в C++.
Хотелось бы сказать "и слава богу", но совесть не позволяет, ибо еще очень свежа память о :
C++
1
2
3
4
auto func() -> int
{
    return 10;
}

0
Croessmah
22.10.2016, 20:21
  #12

Не по теме:

Цитата Сообщение от Nosey Посмотреть сообщение
но совесть не позволяет, ибо еще очень свежа память о
А мне нравится.

0
73 / 69 / 38
Регистрация: 09.10.2012
Сообщений: 238
22.10.2016, 20:28 13
TheCalligrapher, а в чем смысл тэга у struct?
0
7789 / 6556 / 2984
Регистрация: 14.04.2014
Сообщений: 28,661
22.10.2016, 20:32 14
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Откуда вы это взяли - мне не ясно.
Не помню уже. Из какой-то статьи, где разъяснялось, что древний C компилятор как-то по особому группировал имена и их непосредственно нельзя было использовать - либо struct везде писать, либо делать typedef. Под древним я понимаю то, что не C++, а C. Совместимость я и не отрицал.

Добавлено через 3 минуты
mishelle92, первое имя относится к struct, а второе - псевдоним, который назначается с помощью typedef. Нет никакого смысла, кроме совместимости с древним C.
0
Вездепух
Эксперт CЭксперт С++
11694 / 6373 / 1723
Регистрация: 18.10.2014
Сообщений: 16,057
22.10.2016, 20:52 15
Цитата Сообщение от mishelle92 Посмотреть сообщение
а в чем смысл тэга у struct?
Смысл тэга в том, что это основной/фундаментальный способ именования struct-типа в С. Все остальное - это уже псевдонимы.

Наличие тэга позволяет вам создавать типы, ссылающиеся сами на себя (например, при описании элемента списка), а также использовать forward-декларации struct-типов в ситуациях, когда полное объявление типа по какой-то причине недоступно (циклическая зависимость заголовочных файлов, например).

Добавлено через 1 минуту
Цитата Сообщение от nmcf Посмотреть сообщение
Под древним я понимаю то, что не C++, а C.
То есть тема "древности" фактически вылилась в то, что С - "древний" язык, а С++ - "не древний" язык. Это, простите, белиберда. Никакой разницы в степени "древности" между этими языками нет.
1
7789 / 6556 / 2984
Регистрация: 14.04.2014
Сообщений: 28,661
22.10.2016, 20:55 16
TheCalligrapher, ну как нет? Сделали же проще. И с классами typedef не пишут. В C ещё и переменные надо было объявлять в начале, вроде бы. Ещё какие-то ограничения были.
0
Эксперт С++
8739 / 4317 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
22.10.2016, 21:06 17
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Никакой разницы в степени "древности" между этими языками нет.
не считая того, что плюсы моложе своего папочки си.
огааа.

и такой тайпдеф в плюсах никому три раза не упал.
и нужен он исключительно для обратной совместимости
со своим папочкой.
0
Вездепух
Эксперт CЭксперт С++
11694 / 6373 / 1723
Регистрация: 18.10.2014
Сообщений: 16,057
22.10.2016, 21:20 18
Цитата Сообщение от nmcf Посмотреть сообщение
В C ещё и переменные надо было объявлять в начале, вроде бы.
В оригинальном С переменные надо было объявлять в начале блока. В современном С - не надо. Если бы речь шла о требовании объявлять переменные в начале блока, то это требование можно было бы заслуженно назвать "древним"/"устаревшим". Но в данном случае ни о чем подобном речи не идет. Поэтому мне не ясно при чем здесь пример с переменными.

Цитата Сообщение от nmcf Посмотреть сообщение
Ещё какие-то ограничения были.
Ым... С и С++ - совершенно разные языки, отличающиеся в т.ч. на фундаментальном уровне. Отличий там великое множество.

Эти языки существуют параллельно и никакой времннОй "упорядоченности"/"преемственности" (типа С "древний", а С++ - "новый") между С и С++ нет и никогда не было. Поэтому назвать современный синтаксис языка С "древним" только потому, что это С, никто, разумеется, не будет.
0
7789 / 6556 / 2984
Регистрация: 14.04.2014
Сообщений: 28,661
23.10.2016, 11:10 19
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Эти языки существуют параллельно и никакой времннОй "упорядоченности"/"преемственности" (типа С "древний", а С++ - "новый") между С и С++ нет и никогда не было.
Но воспринимается это именно так. Сначала было так, а после по-другому.
0
23.10.2016, 11:10
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
23.10.2016, 11:10
Помогаю со студенческими работами здесь

Вызов пользовательского класса и ошибка E2108 Improper use of typedef 'PROG'
Всем доброго времени суток. У меня есть класс в отдельном файле *.h...

Typedef void F(); typedef для типа функции через идентификатор
Здравствуйте цитата из typedef MSDN в интернете мне удалось нарыть только один конкретный...

Без использования typedef все работает. При добавлении typedef — более 100 ошибок
Есть программа, с описанием структуры и функций, работающими с ней. Без использования typedef все...

Как при создании экземпляра класса инициализировать переменные вложенного класса
Здравствуйте. Подскажите пожалуйста как при создании екземпляра класа инициализировать переменные...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
19
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru