класс C ++ без заголовка - PullRequest
       12

класс C ++ без заголовка

0 голосов
/ 26 октября 2018

Хорошо, поэтому у меня нет проблемы, но вопрос: при использовании c ++ вы можете перенести класс в другой файл и включить его без создания заголовка, например:

foo.cpp:

#include <iostream>
using namespace std;

class foo
{
public:
   string str;
   foo(string inStr)
   {
       str = inStr;
   }
   void print()
   {
      cout<<str<<endl;
   }
};

main.cpp:

#include "foo.cpp"
using namespace std;

int main()
{
   foo Foo("That's a string");
   Foo.print();
   return 0;
}

Итак, вопрос: чем этот метод хуже, чем использование заголовочных файлов?Это намного проще и намного чище, но медленнее ли это, вызывает ли больше ошибок и т.д.?Я давно искал эту тему, но я не видел ни одной темы в интернете, считая это даже вариантом ...

Ответы [ 5 ]

0 голосов
/ 26 октября 2018

Если вы когда-нибудь создадите какой-то более крупный проект, вам станут понятны два основных различия:

  1. Если вы передаете свой код в виде библиотеки другим, вы должны предоставить их все ваш код - все ваши IP - вместо только заголовков открытых классов плюс скомпилированная библиотека.

  2. Если вы измените одну букву в любом файле, вы будетенужно перекомпилировать все .Как только время компиляции для более крупного проекта достигнет нескольких минут, вы потеряете большую производительность.

В противном случае, конечно, это работает, и результат тот же.

0 голосов
/ 26 октября 2018

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

Возможно, вы рассмотрите основную идею о том, что такое «единица перевода C ++».

В вашем примере препроцессор работает так, как будто он вставляет копию foo.cpp во внутреннюю копию main.cpp.Препроцессор делает это, а не компилятор.

Итак ... компилятор никогда не видит ваш код, когда они были отдельными файлами.Именно этот объединенный «блок перевода» передается компилятору.В .hh и .cc нет ничего волшебного, кроме того, что они соответствуют ожиданиям вашего сверстника (или босса).

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


Это намного проще и намного чище,

Это может быть.Я часто использую этот «другой» подход в своих «частных» работах по кодированию.

Когда я быстро оценил использование gmpxx.h (mpz_class) в факториале, я действительно использовал только такие виды ярлыков и не нуждался в файле .hpp для правильного создания модуля компиляции.К вашему сведению - Факториал 12345, более 45 000 байтов.Чтение символов также бессмысленно.

«Более формальное» усилие (работа, сотрудничество и т. Д.), Я всегда использую заголовки и отдельную компиляцию, а также создаю библиотеку функций, полезных для приложения.как часть того, как все должно быть сделано.Особенно, если я мог бы поделиться этим кодом или внести свой вклад в архивы компаний.У меня слишком много веских причин, чтобы описать, почему я рекомендую вам изучить эти вопросы.


но медленнее ли это, вызывает больше ошибок и т.д.?

Я думаю, что нет.Думаю, нет.Есть одна единица компиляции, и объединение частей должно быть правильным, но я думаю, что не сложнее.


Я давно искал эту тему, но у меня нетне видел ни одной темы в интернете, рассматривая это даже как вариант ...

Я не уверен, что я когда-либо видел, чтобы это тоже обсуждалось.Я получил информацию.Отдельные компиляции и разработка библиотеки, как правило, воспринимаются как экономия времени на разработку.(Время - деньги, верно?)

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

0 голосов
/ 26 октября 2018

Вы все еще создали «файл заголовка», но вы дали ему расширение «.cpp».Расширения файлов предназначены для программиста, компилятору все равно.

С точки зрения компилятора, нет разницы между вашим примером и

foo.h:

#include <iostream>
using namespace std;

class foo
{
  //...
};

main.cpp:

#include "foo.h"
using namespace std;

int main()
{
   // ...
}
0 голосов
/ 26 октября 2018

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

Вы просто создали заголовочный файл с именем foo.cpp.

Именование заголовочных файлов с расширением, которое обычно используется для исходных файлов, не является хорошей идеей.Некоторые IDE и другие инструменты могут ошибочно предполагать, что ваш заголовок является исходным файлом, и поэтому пытаются скомпилировать так, как если бы он был таковым, тратя ресурсы, если ничего больше.

Не говоря уже о путанице, которую это может вызвать у ваших коллег,Исходные файлы могут иметь определения, которые стандарт C ++ позволяет определять ровно один раз (см. Одно правило определения odr), поскольку исходные файлы не включены в другие файлы.Если вы называете свой заголовок так, как если бы это был исходный файл, кто-то может предположить, что у него там могут быть определения odr, когда они не могут.

0 голосов
/ 26 октября 2018

Нет семантической разницы между именами ваших файлов .cpp или .hpp (или .c / .h).

Люди будут удивлены #include "foo.cpp", компилятору все равно

...