Я работаю над проектом для школы, и инструктор настаивает на том, чтобы весь код перешел в один .cpp-файл (для упрощения классификации с его стороны). Я хотел бы определить несколько классов в этом файле. Будут ли у меня проблемы с этим?Можно ли определить несколько классов только в одном .cpp-файле?
ответ
Нет правила, которому вы должны следовать (например, в java). Вы можете размещать и указывать классы в любых именованных вами файлах (помимо суффикса).
Однако его другой вопрос, если это хорошая практика (его нет!).
Чтобы добавить к этому, не забывайте, что вам нужно поставить классы, которые вы собираетесь использовать до вашего основного класса, или компилятор их не найдет. (если вы не используете форвардную декларацию) – DaMacc
Нет проблем при написании нескольких классов в один файл. Это только вопрос поддержания стиля.
Проблемы с масштабируемостью/ремонтопригодностью;) В этом нет строгих правил.
Если этот школьный проект страдает от проблем с масштабируемостью, Чаду необходимо отреагировать на зарплату за его работу ;-) –
Да, вы можете. Это легко проверить.
class C
{
};
class D
{
};
int main(int argc, char**argv)
{
return 0;
}
, хотя обычный отказ от использования C++ применяется «только потому, что ваш компилятор принимает это, это не значит, что это разрешено в соответствии со стандартом C++ "(хотя в этом случае это, конечно, отлично) – jalf
Да, хорошая точка. –
Нет. У вас не будет проблем. В C++ вы можете определить несколько классов внутри одного файла.
Вы можете отлично иметь несколько классов, объявленных и определенных в одном файле.
Вы должны быть осторожны, хотя класс зависит от другого, который приходит позже. Если класс A должен быть членом другого класса B, компилятору необходимо его полное объявление (чтобы он знал его размер), и вам нужно поставить его выше в файле. Однако, если этот член является указателем (размер которого не зависит от размера указанного класса), достаточно простого прямого объявления указанного класса.
Обратите внимание, что с помощью механизма #include
это в значительной степени то, что происходит в любом случае: препроцессор будет «скопировать-вставить» все включенные файлы в скомпилированный файл. Для компилятора это точно так же.
У вас не возникнет проблем с определением нескольких классов в одном файле.
Это не особенно хорошая практика для производственных систем, но это не является проблемой для домашней
Да вы можете. Это должно поддерживаться, потому что иначе вы не сможете создавать вложенные классы.
class outside
{
public:
class nested
{
public:
static int x;
static int y;
int f();
int g();
};
};
Как правило, вы должны поставить только несколько классов в одном файле, если ...
Классы очень тесно связаны между собой. Например, если класс определяет свой собственный итератор, тогда может быть целесообразным поместить этот класс итератора в тот же файл, что и класс, который он использовал для перебора.
Один из классов предназначен для общественного потребления, а остальные классы используются для его реализации. Например, это применимо, если вы используете идиому «pimpl», где единственный член, который содержит открытый класс, является указателем на частный класс. В этом случае может быть целесообразным поместить частные/скрытые классы в исходный файл, соответствующий общедоступному классу, который их использует.
В обоих случаях решение о том, чтобы поставить «общественный помощник» (например, итераторы) и «частный помощник» (например,pimpl) в том же исходном файле или в другом исходном файле должны быть сделаны один раз для всего проекта и последовательно выполняться.
Мне нравится ваш ответ, поскольку вы объясняете некоторые виды использования, где это дебатильно правильно. Пример итератора, с которым я определенно согласен. Причина, по которой я это просматривал, состояла в том, что я создаю диалоговое окно с вкладками Qt для моих настроек приложения, и мне нужен класс для окна и классов для вкладок. Я обсуждаю, как разбить вкладки на файлы, но для этого у меня нет места в моей файловой структуре. – Lightbulb1
Вопрос исходит из представления источника стиля java/C#. В C++ макет исходного кода очень отличается. Один источник/«файл cpp»/может обрабатывать столько объявлений, сколько вы хотите добавить. Однако нет необходимости в хорошей стратегии, так как в какой-то момент вам нужно рассказать другим классам, как обращаться с вашими классами. В C++ класс может иметь разделенный раздел определения и объявления, и вы можете разместить их в разных файлах. Определение класса разделяется между другими исходными файлами с помощью операторов #include, поэтому вы можете использовать эти классы в любом сценарии, где требуется определение. Если вы имеете дело с классами, которые используются только в одном исходном файле, вы можете спрятать его прямо в исходных файлах, но если вы хотите связать их с другими классами, вам нужно поместить определение в заголовочный файл.
Это может помочь вам улучшить скорость компиляции - особенно если вы используете предварительно скомпилированные заголовки, но caresully, потому что pch-s не являются частью стандарта C++, и каждый компилятор рассматривает их по-другому! - и гибкость вашего кода. Ваш учитель должен знать об этих фактах ...
Да, вы могли бы сделать это без проблем. либо несколько классов, либо вложенный класс.
- 1. Можно ли определить экземпляры классов в RDFS?
- 2. Можно ли смешивать несколько запросов только в одном?
- 3. Несколько классов в одном div
- 4. Можно ли определить несколько дескрипторов в srcset?
- 5. Можно ли комбинировать несколько ng-классов
- 6. Java: несколько деклараций классов в одном файле
- 7. Определить несколько модулей в одном файле
- 8. Несколько классов асинтетики в одном действии
- 9. Определить несколько классов @Deprecated сразу
- 10. Рекомендуется использовать несколько классов в одном файле?
- 11. USB: Можно определить несколько различных HID-джойстиков на одном интерфейсе?
- 12. Можно ли определить структуру C несколько раз?
- 13. Несколько классов AS в одном SWF-файле
- 14. Можно ли написать несколько угловых компонент в одном файле?
- 15. Несколько классов enum в одном файле Java
- 16. Spring - Можно ли использовать несколько менеджеров транзакций в одном приложении?
- 17. Несколько типов классов в одном списке
- 18. Можно ли определить разные атрибуты для рекурсивных классов в F #
- 19. Несколько классов в одном окне eclipse
- 20. Является ли плохой практикой иметь несколько классов в одном файле?
- 21. Должны ли PHP-скрипты иметь несколько классов в одном файле?
- 22. OrientDB: Можно ли определить вершину, являющуюся экземпляром нескольких классов?
- 23. Можно ли запускать несколько сценариев селен WebDriver в одном браузере?
- 24. Несколько классов приложений в одном проекте
- 25. Несколько классов на одном элементе в титане
- 26. Можно ли определить список любого типа, который реализует несколько интерфейсов?
- 27. Можно ли задать несколько задач jsHint в одном файле Grunt?
- 28. Несколько запросов или можно сделать в одном?
- 29. Возможно ли иметь несколько классов только в одном файле в Eclipse?
- 30. Можно ли добавить несколько компонентов в JPanel в одном выражении?
Вы можете поместить свои классы в любые заголовки, которые хотите, затем запустить gcc -E и отправить инструктору выход. На самом деле этого не делать, потому что (а) ваш инструктор откажется читать его, и (б) все вставки из стандартных заголовков вызовут предупреждения плагиата. Но если вы один раз взглянете на этот вывод и заметите, что он компилируется, вы увидите, что вы можете делать все, что вам нравится, в файле cpp, который вы можете делать в заголовках. –
Если ваш инструктор попросил вас предоставить один файл, то разве не разумно предположить, что ваш язык программирования допускает такую вещь? Какую причину вы сомневались в своем инструкторе по этому вопросу? –
@Rob: хорошая точка, учитывая, что мы знаем ответ, но считаем, что инструкторы часто налагают такие условия, как: «без использования рекурсивных вызовов, только для циклов»; «только с использованием рекурсивных вызовов, без петель»; и вообще «висит вверх дном, одной рукой завязанной за спиной». Без сомнения, из-за разумных причин обучения, но это означает, что ваше предположение не всегда правильно или разумно ;-) –