Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/15: Рейтинг темы: голосов - 15, средняя оценка - 4.67
27 / 1 / 0
Регистрация: 29.06.2011
Сообщений: 136

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

07.11.2012, 14:54. Показов 3181. Ответов 6
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Цитирую книгу:

"Рекомендуется помещать объявление класса в файл с расширением .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() просто создаю объекты и делаю с ними всё, что надо. Мне вот, чайнику, так кажется удобнее гораздо. Объясните кто понимает, почему я не прав.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
07.11.2012, 14:54
Ответы с готовыми решениями:

Напишите реализацию методов, предоставляющих доступ к данным класса. Отобразите в программе работу этих методов
Реализация методов класса. Напишите реализацию методов, предоставляющих доступ к данным класса. Отобразите в программе...

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

Как вынести описание методов вложенного класса за пределы класса?
Подскажите, пожалуйста, как мне вынести описание методов вложенного класса за пределы класса?

6
Неэпический
 Аватар для Croessmah
18146 / 10730 / 2066
Регистрация: 27.09.2012
Сообщений: 27,029
Записей в блоге: 1
07.11.2012, 15:13
почитайте статьи на тему раздельной компиляции
0
 Аватар для SEvg
85 / 85 / 1
Регистрация: 16.10.2012
Сообщений: 304
07.11.2012, 15:37
Для маленьких и простых проектов - удобства нет. Но чем сложнее и больше проект, тем удобнее...
Если в один файл запихнуть, триста тысяч строк кода - удобно будет? А компилировать такой файл, при каждом изменении?

Если есть желание расти, то советую привыкать.
0
27 / 1 / 0
Регистрация: 29.06.2011
Сообщений: 136
07.11.2012, 17:53  [ТС]
Цитата Сообщение от SEvg Посмотреть сообщение
Если в один файл запихнуть, триста тысяч строк кода - удобно будет?
Так у меня просто и складывается впечатление, что если реализацию всех методов всех классов (в большом проекте) запихать в файл .cpp, то он как раз и станет длиной в триста тыс. строк.
0
Неэпический
 Аватар для Croessmah
18146 / 10730 / 2066
Регистрация: 27.09.2012
Сообщений: 27,029
Записей в блоге: 1
07.11.2012, 18:21
А зачем все методы всех классов в один фаил? Один класс - один cpp и один h фаил
1
27 / 1 / 0
Регистрация: 29.06.2011
Сообщений: 136
07.11.2012, 18:25  [ТС]
Цитата Сообщение от Croessmah Посмотреть сообщение
А зачем все методы всех классов в один фаил? Один класс - один cpp и один h фаил
А, так вот. Хорошо. Так может тогда это будут отдельные .cpp файлы, а не тот, где функция main расположена? Так?
0
Неэпический
 Аватар для Croessmah
18146 / 10730 / 2066
Регистрация: 27.09.2012
Сообщений: 27,029
Записей в блоге: 1
07.11.2012, 19:04
Да. Объявление класса в h файле, а реализация в cpp
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
07.11.2012, 19:04
Помогаю со студенческими работами здесь

Наследование: Как мне определить любой из методов заданного класса внутри другого класса?
Добрый день, подскажите пожалуйста, что я делаю не так Есть файл Container.h в котором храню прототипы методов class Container ...

Вызов методов класса из двойного указателя на экземпляр класса
Добрый день! Как можно вызвать метод класса по двойному указателя на его экземпляр? struct Point { void getPoint(){}; ...

Составить описание класса "3D вектор". Объявить объекты класса и продемонстрировать работу методов
Возникли сложности при решении задачи. Буду признателен тем, кто поможет. Задание: Составить описание класса. Объявить объекты класса...

Размещение класса в динамической памяти
Добрый день! Интересует такой вопрос, который я никак не пойму: Есть класс class Container, который создается в динамической памяти. c...

Вызов методов класса
Здравствуйте! При компиляции программы(в среде CodeBloks) выдается такая ошибка: request for member 'Arrayss:: array_proc' in 'j', which...


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Логарифм записывается как: (x-2)log(x^2+2) - означает логарифм (x^2+2) по основанию (x-2). Унарный минус обозначается как ! */ #include <iostream> #include <stack> #include <cctype>. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru