2009-12-07 4 views
7

Я работаю над проектом для школы, и инструктор настаивает на том, чтобы весь код перешел в один .cpp-файл (для упрощения классификации с его стороны). Я хотел бы определить несколько классов в этом файле. Будут ли у меня проблемы с этим?Можно ли определить несколько классов только в одном .cpp-файле?

+2

Вы можете поместить свои классы в любые заголовки, которые хотите, затем запустить gcc -E и отправить инструктору выход. На самом деле этого не делать, потому что (а) ваш инструктор откажется читать его, и (б) все вставки из стандартных заголовков вызовут предупреждения плагиата. Но если вы один раз взглянете на этот вывод и заметите, что он компилируется, вы увидите, что вы можете делать все, что вам нравится, в файле cpp, который вы можете делать в заголовках. –

+1

Если ваш инструктор попросил вас предоставить один файл, то разве не разумно предположить, что ваш язык программирования допускает такую ​​вещь? Какую причину вы сомневались в своем инструкторе по этому вопросу? –

+0

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

ответ

25

Нет правила, которому вы должны следовать (например, в java). Вы можете размещать и указывать классы в любых именованных вами файлах (помимо суффикса).

Однако его другой вопрос, если это хорошая практика (его нет!).

+1

Чтобы добавить к этому, не забывайте, что вам нужно поставить классы, которые вы собираетесь использовать до вашего основного класса, или компилятор их не найдет. (если вы не используете форвардную декларацию) – DaMacc

6

Нет проблем при написании нескольких классов в один файл. Это только вопрос поддержания стиля.

3

Проблемы с масштабируемостью/ремонтопригодностью;) В этом нет строгих правил.

+6

Если этот школьный проект страдает от проблем с масштабируемостью, Чаду необходимо отреагировать на зарплату за его работу ;-) –

9

Да, вы можете. Это легко проверить.

class C 
{ 
}; 

class D 
{ 
}; 

int main(int argc, char**argv) 
{ 
    return 0; 
} 
+6

, хотя обычный отказ от использования C++ применяется «только потому, что ваш компилятор принимает это, это не значит, что это разрешено в соответствии со стандартом C++ "(хотя в этом случае это, конечно, отлично) – jalf

+0

Да, хорошая точка. –

3

Нет. У вас не будет проблем. В C++ вы можете определить несколько классов внутри одного файла.

5

Вы можете отлично иметь несколько классов, объявленных и определенных в одном файле.

Вы должны быть осторожны, хотя класс зависит от другого, который приходит позже. Если класс A должен быть членом другого класса B, компилятору необходимо его полное объявление (чтобы он знал его размер), и вам нужно поставить его выше в файле. Однако, если этот член является указателем (размер которого не зависит от размера указанного класса), достаточно простого прямого объявления указанного класса.

Обратите внимание, что с помощью механизма #include это в значительной степени то, что происходит в любом случае: препроцессор будет «скопировать-вставить» все включенные файлы в скомпилированный файл. Для компилятора это точно так же.

3

У вас не возникнет проблем с определением нескольких классов в одном файле.

Это не особенно хорошая практика для производственных систем, но это не является проблемой для домашней

3

Да вы можете. Это должно поддерживаться, потому что иначе вы не сможете создавать вложенные классы.

class outside 
{ 
public: 
     class nested 
     { 
     public: 
      static int x; 
      static int y; 
      int f(); 
      int g(); 
     }; 
}; 
4

Как правило, вы должны поставить только несколько классов в одном файле, если ...

  1. Классы очень тесно связаны между собой. Например, если класс определяет свой собственный итератор, тогда может быть целесообразным поместить этот класс итератора в тот же файл, что и класс, который он использовал для перебора.

  2. Один из классов предназначен для общественного потребления, а остальные классы используются для его реализации. Например, это применимо, если вы используете идиому «pimpl», где единственный член, который содержит открытый класс, является указателем на частный класс. В этом случае может быть целесообразным поместить частные/скрытые классы в исходный файл, соответствующий общедоступному классу, который их использует.

В обоих случаях решение о том, чтобы поставить «общественный помощник» (например, итераторы) и «частный помощник» (например,pimpl) в том же исходном файле или в другом исходном файле должны быть сделаны один раз для всего проекта и последовательно выполняться.

+0

Мне нравится ваш ответ, поскольку вы объясняете некоторые виды использования, где это дебатильно правильно. Пример итератора, с которым я определенно согласен. Причина, по которой я это просматривал, состояла в том, что я создаю диалоговое окно с вкладками Qt для моих настроек приложения, и мне нужен класс для окна и классов для вкладок. Я обсуждаю, как разбить вкладки на файлы, но для этого у меня нет места в моей файловой структуре. – Lightbulb1

2

Вопрос исходит из представления источника стиля java/C#. В C++ макет исходного кода очень отличается. Один источник/«файл cpp»/может обрабатывать столько объявлений, сколько вы хотите добавить. Однако нет необходимости в хорошей стратегии, так как в какой-то момент вам нужно рассказать другим классам, как обращаться с вашими классами. В C++ класс может иметь разделенный раздел определения и объявления, и вы можете разместить их в разных файлах. Определение класса разделяется между другими исходными файлами с помощью операторов #include, поэтому вы можете использовать эти классы в любом сценарии, где требуется определение. Если вы имеете дело с классами, которые используются только в одном исходном файле, вы можете спрятать его прямо в исходных файлах, но если вы хотите связать их с другими классами, вам нужно поместить определение в заголовочный файл.

Это может помочь вам улучшить скорость компиляции - особенно если вы используете предварительно скомпилированные заголовки, но caresully, потому что pch-s не являются частью стандарта C++, и каждый компилятор рассматривает их по-другому! - и гибкость вашего кода. Ваш учитель должен знать об этих фактах ...

2

Да, вы могли бы сделать это без проблем. либо несколько классов, либо вложенный класс.

Смежные вопросы