Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 27.05.2018, 21:39   #1
Liza256
 
Регистрация: 19.04.2018
Сообщений: 6
Вопрос [C++] Заголовочные файлы

Как работать с несколькими файлами в проекте? Как нужно исправить, то что у меня получилось?

Задача:
Создать класс для хранения календарных дат.Обеспечить возможность работы с датами в различных форматах, изменения даты на заданное количество дней.Перегрузить операцию « – » для нахождения разности дат и операции сравнения. Для класса определить оператор << .Стандартные функции и типы С для работы с датами не использовать.


Код:
#include "stdafx.h"
#include <iostream>
#include <cstdlib>
#include "dmy.h"
using namespace std;

int main(){

	Data denR(1, 3, 1999);
	Data denX(12, 12, 2012);

	cout << denX;
	cout << denR;

	cout <<  denX - denR;

	return 0;
}
Код:
//dmy.h
#include "stdafx.h"
#include <iostream>
#include <cstdlib>
using namespace std;

namespace dmy{

const int MonD[12] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };


	class Data {
	private:

		int day, month, year;

	public:
		Data(int d, int m, int y);
		Data();

		void SetAll(int d, int m, int y);
		int Koldney();

		friend ostream& operator << (ostream& os, const Data& data);
		friend Data operator + (Data &X, int b);
		friend int operator - (Data &X, Data &Y);

	};

	std::ostream& operator << (std::ostream& os, const Data& data);

	Data operator + (Data &X, int b);

	int operator - (Data &X, Data &Y);


}
Код:
//dmy.cpp 
#include "stdafx.h"
#include <iostream>
#include <cstdlib>
#include "dmy.h"
using namespace std;

namespace DMY{

	const int MonD[12] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };

	class Data {
	private:

		int day, month, year;

	public:
		Data(int d, int m, int y){
			SetAll(d, m, y);
		}
		Data(){
			SetAll(0, 0, 0);
		}

		void SetAll(int d, int m, int y){//corr проверка
			day = d;
			month = m;
			year = y;

		}

		int Koldney(){
			int p = 0, s = 0, vYear = 0;
			for (int i = 1; i < month; i++){
				p += MonD[i];
			}

			for (int i = 0; i <= year; i += 4){
				if (((year % 4 == 0) && (year % 100 != 0)) || (year % 400 == 0))
					vYear++;
			};

			s = day + p + (year * 365) + vYear;
			return s;
		}

		friend ostream& operator << (ostream& os, const Data& data);
		friend Data operator + (Data &X, int b);
		friend int operator - (Data &X, Data &Y);

	};

	std::ostream& operator << (std::ostream& os, const Data& data)   //12.02.2013
	{
		os << data.day << ".";
		if (data.month < 10){
			cout << "0";
		}
		os << data.month << "." << data.year << std::endl;
		for (int i = 0; i < 35; i++){
			os << "-";
		}
		os << std::endl;
		return os;
	}

	Data operator + (Data &X, int b){
		X.day += b;
		while (X.day > MonD[X.month])
		{
			X.day -= MonD[X.month];

			X.month++;

			if (X.month > 12){

				X.year++;
				X.month = 0;
			}
		}
		cout << X;
		return X;
	}

	int operator - (Data &X, Data &Y){

		int Otv;
		Otv = abs((X.Koldney()) - (Y.Koldney()));
		return Otv;
	}
}
Liza256 вне форума Ответить с цитированием
Старый 29.05.2018, 01:24   #2
alexzk
Форумчанин
 
Регистрация: 12.04.2017
Сообщений: 889
По умолчанию

На первый взгляд меня смущает
Цитата:
const int MonD[12] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
компилятор видимо тоже смущало, что у вас дважды?

В h файле запишите

Код:
extern const int MonD[12];
В срр файле вероятнее всего так тогда

Цитата:
extern const int MonD[12] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
...но, не совсем ясно, зачем оно в h нужно. Из вашего кода не видно, можно просто было бы удалить в h и не маятся с extern.

Смысл в том, что присваивание фактических значений (= { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }) должно быть в CPP файле, иначе, будут генерироватся копии множественные.
Если в хидере записать так

Цитата:
const int MonD[12] ;
то это все равно присваивание фактического значения "ничего". Поэтому и нужно слово extern, говорящее, что значения искать где-то в cpp.
Но повторюсь, по вашему коду проще удалить из h. Т.к. используется только в 1 срр файле - там его и объявить.

Последний раз редактировалось alexzk; 29.05.2018 в 01:29.
alexzk вне форума Ответить с цитированием
Старый 29.05.2018, 08:04   #3
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,709
По умолчанию

Цитата:
Сообщение от alexzk Посмотреть сообщение
Поэтому и нужно слово extern, говорящее, что значения искать где-то в cpp.
Или узнать про инлайн переменные...
p51x вне форума Ответить с цитированием
Старый 29.05.2018, 11:50   #4
Liza256
 
Регистрация: 19.04.2018
Сообщений: 6
По умолчанию

Спасибо я удалить в h, ошибок стало меньше.

А ещё с main

1 IntelliSense: identifier "Data" is undefined
2 IntelliSense: expected a ';'
3 IntelliSense: expected a ';'
4 IntelliSense: identifier "denX" is undefined
5 IntelliSense: identifier "denR" is undefined
Liza256 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Заголовочные файлы Студ Общие вопросы C/C++ 4 11.04.2014 10:45
Заголовочные файлы Dt Peleduy Qt и кроссплатформенное программирование С/С++ 0 17.10.2012 13:19
Заголовочные файлы в Си Pirr Общие вопросы C/C++ 12 18.03.2011 00:29
Заголовочные файлы legendary Общие вопросы C/C++ 1 11.09.2010 19:41
Заголовочные файлы. C++ Vi_King Помощь студентам 2 03.04.2008 18:47