Что целью typedefing является класс в C++?

Вы можете использовать ссылочную переменную шаблона следующим образом:



Соответствующий plunkr находится здесь https://plnkr.co/edit/JB4HY0oxEUgXXIht2wAv?p=preview

10
задан Neil Williams 6 June 2009 в 03:21
поделиться

7 ответов

См. Предыдущий ответ на связанный вопрос. Это длинная цитата из статьи Дэна Сакса, которая объясняет эту проблему так же ясно, как и все, что я встречал:

Разница между 'struct' и 'typedef struct' в C ++?

Этот метод может предотвратить реальные проблемы (хотя, по общему признанию, редкие проблемы).

Это дешевый элемент страховки - нулевые затраты во время выполнения или в пространстве кода (единственная стоимость - несколько байтов в исходном файле ), но получаемая вами защита настолько мала, что редко можно увидеть, как кто-то ее использует постоянно. У меня есть фрагмент «нового класса», который включает typedef, но если я на самом деле кодирую класс с нуля без использования фрагмента, я почти никогда не утруждаюсь (или помню?), Чтобы добавить typedef.

Итак, я Я бы сказал, что не согласен с большинством приведенных здесь мнений - стоит добавить эти typedef, но недостаточно, чтобы я огорчил кого-либо (включая себя) из-за того, что не вставил их.

Меня попросили пример того, как не иметь имени класса typedef '

7
ответ дан 3 December 2019 в 14:53
поделиться

Это предотвращает компиляцию такого кода:

class SomeClass { ... };
int SomeClass;

Это совершенно законный C ++, хотя он ужасный . Если вы это сделаете, то любые ссылки на чистый SomeClass будут относиться к переменной. Чтобы обратиться к классу, вам нужно явно указать class SomeClass при каждом использовании. Если вы создаете typedef :

class SomeClass { ... };
typedef class SomeClass SomeClass;
int SomeClass;

, то компилятор помечает определение int SomeClass как ошибку, как и должно быть.

20
ответ дан 3 December 2019 в 14:53
поделиться

Мне кажется, что ваш коллега, возможно, не полностью закончил C.

В C, если вы объявите struct foo {int a;}; , у вас нет ничего, что можно было бы вызвать только foo , а скорее struct foo . Поэтому довольно часто typedef struct foo as foo .

Это было изменено в C ++ по причинам, которые должны быть довольно очевидными.

0
ответ дан 3 December 2019 в 14:53
поделиться

Адам указал верную причину для этого, но по поводу вашего вопроса «Стоит ли беспокоиться?» Я бы ответил решительным «Нет!». Возможный код проблемы:

class SomeClass { ... };
int SomeClass;

будет обнаружен, когда немного позже кто-то скажет:

SomeClass sc;

По общему признанию компилятор укажет на «неправильную» строку, но такие вещи случаются так редко (не думаю, что я ' я когда-либо видел это в реальном коде), что он не может оправдать целый лес почти лишних определений типов.

6
ответ дан 3 December 2019 в 14:53
поделиться

Похоже, комментарий пытается сказать, что typedef делает символ SomeClass глобальным таким образом, чтобы никто не мог объявить локальный объект с тем же именем, который скрывает исходный SomeClass .

Я пробовал это с VC6 (это не настоящий компилятор C ++, который я знаю, но лучший из тех, что у меня есть ATM), и, похоже, он мало что дает. SomeClass по-прежнему скрывается локальным объявлением с тем же именем. Возможно, он изменяет содержание сообщения об ошибке для какого-то компилятора, чтобы сделать его более полезным.

0
ответ дан 3 December 2019 в 14:53
поделиться

Я понимаю концепцию разные пространства имен, которые помечают и идентификаторы живут, но это действительно даже стоит того печатаете?

Нет.

-2
ответ дан 3 December 2019 в 14:53
поделиться

Either really broken compiler or someone not knowing what they do, or so I would think.

0
ответ дан 3 December 2019 в 14:53
поделиться
Другие вопросы по тегам:

Похожие вопросы: