Другие языки программирования и технологии

вопрос по C++ как работать с заголовками? компилятор ругается, непойму как связать 3 файла. исходники внутри.

файл 1(главный) #include <stdafx.h> #include <iostream> #include <dog.h> int main() { dog NORA; int tmp; std::cout << "Vozrast NORA?\n"; std::cin >> tmp; NORA.Gaf(); NORA.SetAge(tmp); std::cout << "Vozrast NORA=" << NORA.GetAge() << "\n"; return 0; } файл dog.h #include <stdafx.h> #include <iostream> #include <dog.cpp> class dog { public: void Gaf(); int GetAge(); void SetAge(int SAge); private: int Age; }; файл dog.cpp #include <stdafx.h> #include <iostream> void dog::Gaf() { std::cout << "Gaf-Gaf!\n"; } int dog::GetAge() { return Age; } void dog::SetAge(int SAge) { Age=SAge; } когда загоняю все одним файлом прекрасно работает, а так нет*( как поступить в данном случае? и как вообще устроена эта вся система в целом?
Не dog.h должен к себе подключать dog.cpp, а наоборот.

В dog.h хранится прототип, который должен быть подключен ко всем файлам, где иcпользуется класс "dog", в том числе к файлу dog.cpp, в котором прописывается реализация класса и к файлу с функцией main, т. к. там создаётся объект этого класса.

Сам dog.cpp не должен подлючаться ни к каким другим файлам, связь с его содержимым устанавливается на этапе линковки программы.

Вывод: в файлах dog.cpp и main.cpp нужно написать #include <dog.h>
Мих@ил Рыжов
Мих@ил Рыжов
5 305
Лучший ответ
В заголовочные файлы (*.h) ничего не включаешь (*.cpp) , так же первой строкой пишешь
#pragma once

В *. cpp
первой строкой пишешь
#include "stdafx.h"

далее по необходимости все отстальные заголовочные файлы
Nicolai Botoroga
Nicolai Botoroga
21 360
.h файлы предназначены для вынесения в них краткой описательной информации о блоке кода (.cpp, .c с тем же названием - для удобства) .

при такой разбивке, в .c или .cpp вы подключаете .h.

при написании .h очень желательно следовать правилу единичного включения. например, для файла stuff.h можно сделать так:

#ifndef __STUFF_H
#define __STUFF_H
код
#endif

в этом случае повторный include stuff.h будет фиктивным
Oleg Ivanov
Oleg Ivanov
17 923
В "dog.h"не подключаешь ни чего, это файл описание и он ни какие ф-ции не использует.
"dog.cpp"-файл реализации, ему нужно описание класса ("dog.h") и библиотека ввода-вывода. Но так как ввод-вывод используется в разных файлах, то #include"iostream" нужно указать в файле"stdafx.h",а его уже указать во всех файлах .cpp.
В главном файле указываешь
#include"stdafx.h"
#include"dog.h"
Павел Ромасев
Павел Ромасев
9 759
Что бы исключить двойное включение файла помещай в заголовки следующие строки

#ifndef _DOG_H
#define _DOG_H

тут пишем тело

#endif

В папке include можно посмотреть, любой заголовочный файл содержит такие строки.
Сергей Крылов
Сергей Крылов
2 360