Почему при создании нового класса C ++ создаются два файла (.h и .cpp)? - PullRequest
3 голосов
/ 06 декабря 2010

Я немного программировал на C ++ около 14 лет назад.Я познакомился с новыми технологиями, такими как .NET, с которыми я в основном работаю.

Теперь я пишу приложение Windows для списка телефонов simlpe, которое я хочу сделать C ++, чтобы лучше видеть C #и C ++ различия.

Позвольте мне сказать, что я уже заметил разницу!Хехехе ... Следовательно, одно из этих различий заключается в том, что при создании нового класса C ++ из шаблона Visual Studio он создает не только файл класса .cpp, но и файл заголовка вместе с ним.

Почемучто так?Зачем создавать файлы class1.h и class1.cpp для одного класса?

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

Вопросы

  1. Почему при добавлении нового класса C ++ создаются два файла (.h и .cpp)?
  2. Должен ли яопределить элементы в заголовочном файле и определить ядро ​​функций в файле cpp?
  3. Если нет 2, для чего нужен заголовочный файл в этом конкретном сценарии?

EDIT # 1

Тогда мой код должен выглядеть следующим образом?

// Customer.h header file
ref class Customer {
    private:
        char* _number, _name;
        long _phoneNumber;

    public:
        char[] get_number();
        void set_number(char* number);
        char[] get_name();
        void set_name(char* name);
        long get_phoneNumber();
        void set_phoneNumber(long phoneNumber);
        void set_name(char* name);
}

Тогда:

// Customer.cpp
#include <Customer.h>

char[] Customer::get_number() {
    return _number;
}

void Customer::set_number(char* number) {
    if (number != null && sizeof(number) < 1) return;
    _number = number;
}

// And the other members here...

Теперь я знаю, что большинство будет многоошибки в моем коде.Я буду рад, если вы поможете мне исправить их, чтобы я мог улучшить свои навыки C ++.

Спасибо, что помогли мне разобраться в этом.

Ответы [ 4 ]

3 голосов
/ 06 декабря 2010

Функции и классы в C ++ должны быть объявлены перед их использованием, это просто объявление о том, что эти функции можно использовать из этого файла. Эти объявления импортируются с использованием заголовочных файлов (.hpp / .h файлы).

Чтобы объявить функцию, вы должны написать:

return type function name ( arguments );

Итак, эта функция:

int factorial (int x)
{
  if (x == 0)
    return 1;
  return x * factorial (x - 1);
}

Было бы предварительно объявлено так:

int factorial (int x);

Объявление классов выглядит так:

class class name { function and variable declarations };

Итак, class Foo с методом bar и переменной-членом public baz будет выглядеть так:


foo.hpp:

#ifndef FOO_HPP_
#define FOO_HPP_

class Foo
{
public:
  int baz;

  void bar ();
};

#endif

foo.cpp:

#include "foo.hpp"
#include <iostream>

void Foo::bar ()
{
  std::cout << baz << std::endl;
}
1 голос
/ 06 декабря 2010

Заголовочные файлы объявляют / определяют класс. Он содержит функции-члены, данные-члены, друзей и т. Д. Как правило, он не включает в себя большую часть (если таковая имеется) реализации (исключение составляют шаблоны).

Файлы реализации (* .cpp) - это просто: они реализуют класс.

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

1 голос
/ 06 декабря 2010

Заголовочные файлы требуются для компиляции C ++, поскольку они работают практически не так, как в C #.

В C # связь между двоичными модулями всегда динамическая.В C ++ существует разница между статической и динамической связью.Чтобы вдаваться в детали, мне потребовался бы целый час написания, но, скажем, кратчайшим путем.

В C ++ каждый файл .cpp отдельно компилируется в объектный файл.Этот файл должен быть связан с другими, чтобы сформировать двоичный файл.Заголовочный файл объявляет все сигнатуры методов , необходимые для файла .cpp, в который он включен, то есть файла, который вызывает методы, определенные для класса.

В C # все файлы компилируютсяв один двоичный файл, т.е.компилятор всегда знает, какие классы и методы видны компилируемым членом.

1 голос
/ 06 декабря 2010

Классы объявлены в заголовке, а большая часть функциональности определена в файле .cpp. Этот инструмент помогает вам отделить интерфейс от реализации.

Способ думать о разделении между заголовком и .cpp файлом:

  • Заголовки содержат объявления, которые будут использоваться другими файлами.
  • .cpp файлы содержат реализацию.

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

...