Редактировать: прочитать строки, выделенные жирным шрифтом, чтобы найти, где у меня проблемы. После прочтения ответов я изменил код, но все равно получаю сообщение об ошибке
Я новичок в C ++, и я тестирую некоторые вещи, чтобы узнать, как использовать язык, и я столкнулся с этим случаем:
У меня есть struct
, который создает указатель на другой struct
. Этот другой struct
, в свою очередь, создает указатель на struct
, который его создал в первую очередь.
Вот быстрый пример, чтобы объяснить, что я имею в виду, немного лучше (эта часть была изменена с добавлением кода с жирным шрифтом, где у меня возникают проблемы):
#include <string>
using namespace std;
struct Month;
struct Year;
struct Day{
unsigned int day, dayNumber;
string name;
Day(){}
void setDayNumber(unsigned int dayNumber){
this -> dayNumber = dayNumber;
switch(dayNumber){
case 0:
name = "Sunday";
break;
case 1:
name = "Monday";
break;
case 2:
name = "Tuesday";
break;
case 3:
name = "Wednesday";
break;
case 4:
name = "Thursday";
break;
case 5:
name = "Friday";
break;
case 6:
name = "Saturday";
break;
}
}
};
struct Month{
string name;
unsigned int monthLength, monthNumber;
Month *previousMonth, *nextMonth;
Year *year;
Day *days;
Month(unsigned int monthNumber, Year *year){
this -> monthNumber = monthNumber;
switch(monthNumber){
case 0:
name = "January";
break;
case 1:
name = "February";
break;
case 2:
name = "March";
break;
case 3:
name = "April";
break;
case 4:
name = "May";
break;
case 5:
name = "June";
break;
case 6:
name = "July";
break;
case 7:
name = "August";
break;
case 8:
name = "September";
break;
case 9:
name = "October";
break;
case 10:
name = "November";
break;
case 11:
name = "December";
break;
}
previousMonth = NULL;
nextMonth = NULL;
this -> year = year;
}
void createDays(){
if(name == "January" || name == "March" || name == "May" || name == "July" || name == "August" || name == "October" || name == "December")
monthLength = 31;
else if(name != "February")
monthLength = 30;
else{
**if(year -> isLeapYear() == true)** //This line is problematic, see below the code to see what the compiler says
monthLength = 29;
else
monthLength = 28;
}
days = new Day[monthLength];
for(unsigned int i = 0; i < monthLength; i++){
days[i].day = i+1;
if(i == 0 && previousMonth == NULL)
days[i].setDayNumber(2);
else if(i == 0)
days[i].setDayNumber(previousMonth -> days[previousMonth -> monthLength - 1].dayNumber);
else
days[i].setDayNumber(days[i-1].dayNumber);
}
}
};
struct Year{
unsigned int year;
Year *previousYear, *nextYear;
Month *months;
Year(unsigned int year){
this -> year = year;
previousYear = NULL;
nextYear = NULL;
}
void createMonths(){
Month *currentMonth = months;
unsigned int monthNumber;
for(unsigned int i = 0; i < 12; i++){
months = new Month(i, this);
}
while(currentMonth != NULL){
monthNumber = currentMonth -> monthNumber;
if(monthNumber == 0 && previousYear != NULL){
months[monthNumber].previousMonth = &(previousYear -> months[11]);
months[monthNumber].nextMonth = &(months[monthNumber+1]);
}
else if(monthNumber == 11 && nextYear != NULL){
months[monthNumber].nextMonth = &(nextYear -> months[0]);
months[monthNumber].previousMonth = &(months[monthNumber-1]);
}
else{
if(monthNumber != 0)
months[monthNumber].previousMonth = &(months[monthNumber-1]);
if(monthNumber != 11)
months[monthNumber].nextMonth = &(months[monthNumber+1]);
}
}
currentMonth = months;
while(currentMonth != NULL){
currentMonth -> createDays();
currentMonth = currentMonth -> nextMonth;
}
}
bool isLeapYear(){
if(year % 4 == 0 && (year % 100 != 0 || year % 400 == 0))
return true;
else
return false;
}
};
Вот сообщения, которые выводит компилятор:
pe_019.cpp(107): error C2027: use of undefined type 'Year'
pe_019.cpp(10) : see declaration of 'Year'
pe_019.cpp(107): error C2227: left of '->isLeapYear' must point to class/struct/union/generic type
Очевидно, что в этом есть нечто большее, но в Year
я использую массив struct Month
, а в Month
есть указатель на его родительский Year
. (То же самое для Day
, имеет родителя Month
).
Когда я пытаюсь скомпилировать, компилятор говорит, что я использую неопределенный struct 'Month'
, что Month*
имеет неизвестный размер и т. Д.
Я почти уверен, что это потому, что Month
используется до того, как оно объявлено, но я не могу сначала объявить его, потому что тогда Year
будет необъявленным struct
.
Как правильно это сделать?
Редактировать: После того, как я прочитал ответы на этот вопрос, я объявил год и поставил месяц до года, но у меня все еще возникают проблемы из-за функции, которую я не включил в свой первоначальный пост с тех пор Я не думал, что это было частью проблемы, я отредактировал свой код, чтобы сделать его более полным.