Можно определить несколько классов в один.cpp файл?

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

11 ответов


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

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


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

class C
{
};

class D
{
};

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

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


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

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

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


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

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

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

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


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


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


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

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


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

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

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

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


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