f (пусто) удержанный от использования в современном C и C++ [дубликат]

Это зависит от поведения вашего «командного» объекта. Если он ведет себя точно так же, как в коллекции, возможно, это будет нормально представлять его сначала с помощью простого списка. Тогда вы можете начать замечать, что вы продолжаете дублировать код, который повторяется в списке; на данный момент у вас есть возможность создать объект FootballTeam, который обертывает список игроков. Класс FootballTeam становится домом для всего кода, который повторяется в списке игроков.

Это делает мой код излишне подробным. Теперь я должен назвать my_team.Players.Count вместо my_team.Count. К счастью, с C # я могу определить индексаторов, чтобы сделать индексирование прозрачным, и переслать все методы внутреннего списка ... Но это много кода! Что я могу получить за все это?

Инкапсуляция. Ваши клиенты не должны знать, что происходит внутри FootballTeam. Для всех ваших клиентов это может быть реализовано путем просмотра списка игроков в базе данных. Им не нужно знать, и это улучшает ваш дизайн.

Это просто не имеет никакого смысла. Футбольная команда не имеет «списка» игроков. Это список игроков. Вы не говорите: «Джон Макфуталлер присоединился к игрокам SomeTeam». Вы говорите: «Джон присоединился к SomeTeam». Вы не добавляете письмо в «символы строки», вы добавляете письмо к строке. Вы не добавляете книгу в книги библиотеки, вы добавляете книгу в библиотеку.

Точно :) вы скажете footballTeam.Add (john), а не footballTeam.List.Add (Джон). Внутренний список не будет виден.

67
задан Derek 13 September 2012 в 16:37
поделиться

4 ответа

В C объявление int f(void) означает интервал возврата функции, который не берет параметров. Объявление int f() означает интервал возврата функции, который берет любое количество параметров. Таким образом, если у Вас есть функция, которая не берет параметров в C, первый - корректный прототип.

В C++, я верю int f(void), удерживается от использования, и int f() предпочтен, поскольку это конкретно означает функцию, которая не берет параметров.

97
ответ дан Daniel Daranas 24 November 2019 в 14:35
поделиться

Добавить к ответу Chris, с помощью int f() - плохая практика в C, по моему опыту, так как Вы теряете способность компилятора сравнить объявление функции с его определением, гарантировать, что это назовут правильно.

, Например, следующий код является совместимым стандартами C:

#include <stdio.h>
void foo();
void bar(void) {
    foo();
}
void foo(int a) {
    printf("%d\n", a);
}

, Но это приводит к неопределенному поведению, так как a не был передан foo.

В C++, существует две версии foo: тот, который не берет аргументов и того, который берет int. Так bar завершает вызов неопределенной версии, которая привела бы к ошибке компоновщика (предполагающий, что нет никаких других определений foo нигде).

21
ответ дан Zach Hirsch 24 November 2019 в 14:35
поделиться

Ответы выше довольно корректны, но я связываюсь с превосходной страницей David Tribble, поскольку она дает большое объяснение на этом и многих других проблемах.

выделения:

C различает функцию, объявленную с пустым списком параметров и функцию, объявленную со списком параметров, состоящим из только пусто. Первый - несмоделированная функция, берущая неуказанное количество аргументов, в то время как последний является смоделированной функцией, берущей аргументы.

C++, с другой стороны, не делает различия между этими двумя объявлениями и полагает, что они оба имеют в виду функцию, берущую аргументы.

Для кода, который предназначается, чтобы быть скомпилированным или как C или как C++, лучшее решение этой проблемы состоит в том, чтобы всегда объявлять функции, берущие параметры с явным пустым прототипом.

Пустые прототипы функции являются устаревшей функцией в C99 (как они были в C89).

Редактирование: После рассмотрения стандарта, возможно, стоит отметить, что func (пустой) синтаксис не удержан от использования в C++, но это обычно рассматривало больше идиомы C-стиля. Я думаю большинство программистов на C++, на которых я натыкался, предпочитают пустой список параметров.

Редактирование 2: Добавляя кавычку из стандарта C++, разделите 8.3.5, абзац 2:

, "Если пункт объявления параметра пуст, функция не берет аргументов. Список параметров (пусто) эквивалентен пустому списку параметров. За исключением этого особого случая, пусто не будет тип параметра (хотя типы, полученные из пустоты, такой как пусто*, могут)".

нет никакого упоминания, что любая форма удерживается от использования. Еще раз спасибо к превосходному веб-сайту г-на Tribble для указания на меня к корректному разделу стандарта.

17
ответ дан Dan Olson 24 November 2019 в 14:35
поделиться

В C++, int f(void) действительно объявление устаревшее, которое является 100%-м эквивалентом int f(). Это та же подпись. void в этом контексте является столь же значительным как например, пробел. Это также означает, что они подчиняются Одному Правилу Определения (они не перегружаются), и Derived::f(void) переопределения Base::f().

не смешивают с материалом как f(const void), все же. Нет большого согласия, что означает такая странность.

-1
ответ дан hochl 24 November 2019 в 14:35
поделиться
Другие вопросы по тегам:

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