Форум программистов, компьютерный форум CyberForum.ru

Размещение реализаций методов класса - C++

Восстановить пароль Регистрация
 
Alex Z
27 / 1 / 0
Регистрация: 29.06.2011
Сообщений: 136
07.11.2012, 14:54     Размещение реализаций методов класса #1
Цитирую книгу:

"Рекомендуется помещать объявление класса в файл с расширением .h, а реализацию его функций-членов - в файл с расширением .cpp."

Пример из этой же книги:

Файл Cat.h:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
#include <iostream>
 
class Cat
{
public:
    Cat(int);
    ~Cat();
    int GetAge() const { return itsAge; }         // встроенная функция
    void SetAge(int age) { itsAge = age; }        // встроенная функция
    void Meow() const { std::cout << "Meow.\n"; } // встроенная функция
private:
    int itsAge;
};
Файл Cat.cpp:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#include "Cat.h"
 
// Конструктор класса Cat
Cat::Cat (int initialAge)
{
    itsAge = initialAge;
}
 
Cat::~Cat()
{
}
 
// Создать кота, установить его возраст, мяукнуть,
// сообщить его возраст, затем мяукнуть снова
int main()
{
    Cat Frisky(5);
    Frisky.Meow();
    std::cout << "Frisky is a cat who is ";
    std::cout << Frisky.GetAge() << " years old.\n";
    Frisky.Meow();
    Frisky.SetAge(7);
    std::cout << "Now Frisky is ";
    std::cout << Frisky.GetAge() << " years old.\n";
    
    char response;        
    std::cin >> response; 
        
    return 0;
}
Здесь автор объявляет класс в заголовочном файле, а реализацию методов помещает в основной файл программы. Правда из методов в файле .cpp оказываются только конструктор и деструктор. Но это только потому, что функции-члены GetAge(), SetAge() и Meow() сделаны встраиваемыми, т.е. реализация расположена в самом объявлении класса. В других примерах из этой же книги функции-члены, не являющиеся встроенными, также помещены авторами в основной файл .cpp.

Об этом я и хотел спросить. В книге пишут, что типа это очень удобно и все хорошие программисты так делают. А я думал-думал несколько дней, разные примеры смотрел/разбирал, но так и не понял в чём тут удобство. Мне, например, наоборот кажется, что так неудобно. Я у себя на компе этот пример переделал следующим образом:
Файл Cat.h:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
class Cat
{
public:
    Cat(int);
    ~Cat();
    int GetAge() const { return itsAge; }         // встроенная функция
    void SetAge(int age) { itsAge = age; }        // встроенная функция
    void Meow() const { std::cout << "Meow.\n"; } // встроенная функция
private:
    int itsAge;
};
 
// Конструктор класса Cat
Cat::Cat (int initialAge)
{
    itsAge = initialAge;
}
 
Cat::~Cat()
{
}
Файл Cat.cpp:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <iostream>
#include "Cat.h"
 
// Создать кота, установить его возраст, мяукнуть,
// сообщить его возраст, затем мяукнуть снова
int main()
{
    Cat Frisky(5);
    Frisky.Meow();
    std::cout << "Frisky is a cat who is ";
    std::cout << Frisky.GetAge() << " years old.\n";
    Frisky.Meow();
    Frisky.SetAge(7);
    std::cout << "Now Frisky is ";
    std::cout << Frisky.GetAge() << " years old.\n";
    
    char response;        
    std::cin >> response; 
        
    return 0;
}
И остальные примеры из этой же книги я делаю аналогично: в заголовочный файл помещаю объявление класса, ниже под ним располагаю реализацию всех функций-членов. А в основном файле программы, внутри main() просто создаю объекты и делаю с ними всё, что надо. Мне вот, чайнику, так кажется удобнее гораздо. Объясните кто понимает, почему я не прав.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11822 / 6801 / 769
Регистрация: 27.09.2012
Сообщений: 16,868
Записей в блоге: 2
Завершенные тесты: 1
07.11.2012, 15:13     Размещение реализаций методов класса #2
почитайте статьи на тему раздельной компиляции
SEvg
 Аватар для SEvg
85 / 85 / 1
Регистрация: 16.10.2012
Сообщений: 305
07.11.2012, 15:37     Размещение реализаций методов класса #3
Для маленьких и простых проектов - удобства нет. Но чем сложнее и больше проект, тем удобнее...
Если в один файл запихнуть, триста тысяч строк кода - удобно будет? А компилировать такой файл, при каждом изменении?

Если есть желание расти, то советую привыкать.
Alex Z
27 / 1 / 0
Регистрация: 29.06.2011
Сообщений: 136
07.11.2012, 17:53  [ТС]     Размещение реализаций методов класса #4
Цитата Сообщение от SEvg Посмотреть сообщение
Если в один файл запихнуть, триста тысяч строк кода - удобно будет?
Так у меня просто и складывается впечатление, что если реализацию всех методов всех классов (в большом проекте) запихать в файл .cpp, то он как раз и станет длиной в триста тыс. строк.
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11822 / 6801 / 769
Регистрация: 27.09.2012
Сообщений: 16,868
Записей в блоге: 2
Завершенные тесты: 1
07.11.2012, 18:21     Размещение реализаций методов класса #5
А зачем все методы всех классов в один фаил? Один класс - один cpp и один h фаил
Alex Z
27 / 1 / 0
Регистрация: 29.06.2011
Сообщений: 136
07.11.2012, 18:25  [ТС]     Размещение реализаций методов класса #6
Цитата Сообщение от Croessmah Посмотреть сообщение
А зачем все методы всех классов в один фаил? Один класс - один cpp и один h фаил
А, так вот. Хорошо. Так может тогда это будут отдельные .cpp файлы, а не тот, где функция main расположена? Так?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
07.11.2012, 19:04     Размещение реализаций методов класса
Еще ссылки по теме:

Составить описание класса "3D вектор". Объявить объекты класса и продемонстрировать работу методов C++
Шаблоны методов класса C++
Утилизация класса (размещение класса в другом файле) C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11822 / 6801 / 769
Регистрация: 27.09.2012
Сообщений: 16,868
Записей в блоге: 2
Завершенные тесты: 1
07.11.2012, 19:04     Размещение реализаций методов класса #7
Да. Объявление класса в h файле, а реализация в cpp
Yandex
Объявления
07.11.2012, 19:04     Размещение реализаций методов класса
Ответ Создать тему
Опции темы

Текущее время: 23:10. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru