Witam!
Podczas przerabiania książki Principles and Practise Using C++ natrafiłem na dość trudne zadanie uporządkowania i "zmuszenia" do działania kodu. Całość została podzielona na deklaracje w pliku nagłówkowym oraz definicję w źródłowym. Zacząłem analizować podstawiony kod i w celu zobaczenia błędów, skompilowałem całość, ale trochę się przeraziłem bo ilość nieprawidłowości wynosiła ponad 120. Ale podjąłem się zadania - jak i z resztą prawdopodobnie dam sobie radę, tak nie mam pojęcia co może być przyczyną tego, że zmienne w pliku źródłowym "mówią" o braku deklaracji lub o tym, że klasa "date" nie jest klasą ani przestrzenią nazw.
Cały plik nagłówkowy:
#include <iostream>
using namespace std;
//------------------------------------------------------------------------------
namespace Chrono {
//------------------------------------------------------------------------------
class Date {
public:
enum Month {
jan=1, feb, mar, apr, may, jun, jul, aug, sep, oct, nov, dec
};
class Invalid { }; // to throw as exception
Date(int y, Month m, int d); // check for valid date and initialize
Date(); // default constructor
// the default copy operations are fine
// non-modifying operations:
int day() const { return d; }
Month month() const { return m; }
int year() const { return y; }
// modifying operations:
void add_day(int n);
void add_month(int n);
void add_year(int n);
private:
int y;
Month m;
int d;
};
//------------------------------------------------------------------------------
bool is_date(int y, Date::Month m, int d); // true for valid date
//------------------------------------------------------------------------------
bool leapyear(int y); // true if y is a leap year
//------------------------------------------------------------------------------
bool operator==(const Date& a, const Date& b);
bool operator!=(const Date& a, const Date& b);
//------------------------------------------------------------------------------
ostream& operator<<(ostream& os, const Date& d);
istream& operator>>(istream& is, Date& dd);
//------------------------------------------------------------------------------
} // Chrono
Przykładowy fragment pliku głównego. W pierwszych linijkach dopisałem komentarz, który tłumaczy problem:
#include "G:/Projects/Object_programming_part_4/Chrono.h"
#include "pch.h"
namespace Chrono {
// member function definitions:
//------------------------------------------------------------------------------
Date::Date(int yy, Month mm, int dd) // i tu od razu już mam na przykład taki error C2653 Date: is not a class or namespace name
: y(yy), m(mm), d(dd) // tutaj natomiast, że yy, mm i dd są niezdeklarowane.
{
if (!is_date(yy, mm, dd)) throw Invalid(); // znowu mm, dd i yy niezdeklarowane oraz is_date: identifier not found
}
//Takie błędy jak wymienione wyżej ciągną się przez cały kod. Wstawiłem tutaj tylko jego fragment, żeby aż tak nie zaburzać czytelności
const Date& default_date()
{
static const Date dd(2001, Date::jan, 1); // start of 21st century
return dd;
}
//------------------------------------------------------------------------------
Date::Date()
:y(default_date().year()),
m(default_date().month()),
d(default_date().day())
{
}
//------------------------------------------------------------------------------
void Date::add_day(int n)
{
//..
}
//------------------------------------------------------------------------------
void Date::add_month(int n)
{
// ...
}
//------------------------------------------------------------------------------
void Date::add_year(int n)
{
if (m == feb && d == 29 && !leapyear(y + n)) { // beware of leap years!
m = mar; // use March 1 instead of February 29
d = 1;
}
y += n;
}
Prosiłbym o jakieś wskazówki, które wyjaśniłyby mi dlaczego zmienne nie wykrywają deklaracji w pliku nagłówkowym.