2012-01-26 5 views
1

Я создаю класс «date» в C++, который содержит переменные дня, месяца и года и кучу функций оператора, чтобы использовать его.C++ Необъявленный идентификатор внутри операторской функции

У меня есть заголовок date.h и date.cpp для моего класса, а одна из операторских функций в date.cpp дает мне кучу ошибок.

date.cpp (Я хочу, чтобы этот оператор-функция для подсчета дней добавлены и возвращает новый объект даты и избежать изменения исходного объекта даты.)

date date::operator+(long days) const{ 

    date dTemp(date.getDay(), date.getMonth(), date.getYear()); 

    for(int i=0;i<days;i++){ 

     //If days go over a months day count. 
     if(dTemp.getDay() >= daysInMonth[dTemp.getMonth()]){ 
      dTemp.setDay(1); 
      if(dTemp.getMonth() < 12){ 
       dTemp.setMonth(dTemp.getMonth() + 1); 
      } 
      else{ 
       //Changing a year. 
       dTemp.setMonth(1); 
       dTemp.setYear(dTemp.getYear() + 1); 
      } 

     } 
     else{ 
      dTemp.setDay(dTemp.getDay() + 1); 
     } 
    } 
    return dTemp; 
} 

Ошибки:

1>h:\c++\teht21\teht20\date.cpp(74): error C2143: syntax error : missing ')' before '.' 
1>h:\c++\teht21\teht20\date.cpp(74): error C3484: syntax error: expected '->' before the return type 
1>h:\c++\teht21\teht20\date.cpp(74): error C2061: syntax error : identifier 'getDay' 
1>h:\c++\teht21\teht20\date.cpp(79): error C2065: 'dTemp' : undeclared identifier 
1>h:\c++\teht21\teht20\date.cpp(79): error C2228: left of '.getDay' must have class/struct/union 
1>   type is ''unknown-type'' 

линия 74 является:

date dTemp(date.getDay(), date.getMonth(), date.getYear()); 

Любая помощь очень ценится. Если вам нужно увидеть больше кода, дайте мне знать.

ответ

3

Если getDay(), getMonth(), getYear() являются функциями-членами, и вы хотите, чтобы вызвать их на this то изменить:

date dTemp(date.getDay(), date.getMonth(), date.getYear()); 

до:

date dTemp(getDay(), getMonth(), getYear()); 
+0

Это похоже на работу, большое спасибо. В чем разница между ответом и ответом dbrank0? Потому что оба, похоже, работают. Просто любопытно, потому что я только начал изучать C++. – Baburo

+2

@Baburo: разница в том, что код dbrank0 полностью квалифицирует имя функции. Если 'getDay' является виртуальной функцией, а' operator + 'вызывается в производном классе' date', то 'date :: getDay()' будет вызывать версию функции в 'date', тогда как' getDay() 'будет вызывать любое переопределение в производном классе. В противном случае это не имеет значения, это просто другой способ указать ту же функцию. –

+1

Кстати, вы также могли бы написать 'date dTemp (* this);', который будет использовать конструктор копирования для создания 'dTemp' –

2

Возможно, вы хотите вызвать статические методы здесь:

date dTemp(date.getDay(), date.getMonth(), date.getYear()); 

Итак:

date dTemp(date::getDay(), date::getMonth(), date::getYear());