Création d'une classe

Création d'une classe - C++ - Programmation

Marsh Posté le 01-12-2016 à 13:44:38    

Bonjour à tous
 
Le compilateur me sort cette erreur "cannot resolve adress of overloaded function" à la ligne 29 du main, et ce même quand je mets un truc tout simple (pour tester) à la fonction Display, du genre "cout << "blah" << std::endl;"
 
Voici mes fichiers (je programme avec code::blocks et MinGW g++ 5.1  en c++14 si je ne dis pas de bêtises)
 
Je bloque depuis quelques heures
 
Thank you
 
main :

Code :
  1. #include <iostream>
  2. #include <string>
  3. #include <array>
  4. #include "MaDate.h"
  5. // programme qui fait correspondre un jour de la semaine à une date. Basé sur le 01/01/1600
  6. // ========================================================================================
  7. int main() {
  8.     std::cout << "\n ===================================================" << std::endl;
  9.     std::cout << " Calcul du jour de la semaine en fonction d'une date" << std::endl;
  10.     std::cout << "\t\t Lundi a Dimanche" << std::endl;
  11.     std::cout << "\tFonctionne a partir du 1 - 1 - 1600" << std::endl;
  12.     std::cout << "\t    Par Harvey - Novembre 2016" << std::endl;
  13.     std::cout << " ===================================================" << std::endl;
  14.     MaDate D;
  15.     bool playAgain = true;
  16.     std::string pAgain = "";
  17.     while (playAgain)
  18.     {
  19.         if(D.DateEntry() )
  20.         {
  21.             D.Display;
  22.         }
  23.         std::cout << "\n Nouveau calcul ? Taper O/N ";
  24.         std::cin >> pAgain;
  25.         if( (pAgain=="N" ) || (pAgain=="n" ) )
  26.         {
  27.             playAgain=false;
  28.         }
  29.         //daysInFullYears=0; daysInFullMonths=0;  // réinitialisations sinon ça cumule
  30.     }
  31. }


 
MaDate.h

Code :
  1. #ifndef MADATE_H_INCLUDED
  2. #define MADATE_H_INCLUDED
  3. //#include <string>
  4. class MaDate
  5. {
  6.     int day, months, year;
  7.     std::string finalDay;
  8.     int dIFY(); //total de jours dans les années pleines
  9.     int dIFM(); //total de jours dans les mois pleins
  10.     void amountAndFinalDay(); // calcul final = nb de jours total et attribution du jour de la semaine
  11. public:
  12.     MaDate();
  13.     bool DateEntry();
  14.     void Display();
  15. };
  16. #endif // MADATE_H_INCLUDED


 
MaDate.cpp

Code :
  1. #include "MaDate.h"
  2. MaDate::MaDate()
  3. {
  4.     day = " ";
  5.     month = " ";
  6.     year = " ";
  7. }
  8. void MaDate::DateEntry()  // saisie de la date
  9. {
  10.     std::cout << "\n Entrez le jour (ex : 17) : ";
  11.     std::cin >> day;
  12.     std::cout << " Entrez le mois (ex : 04) : ";
  13.     std::cin >> month;
  14.     std::cout << " Entrez l'annee (ex : 1925) : ";
  15.     std::cin >> year;
  16. }
  17. int MaDate::dIFY()    // calcul de daysInFullYears : le nombre de jours total dans les années pleines
  18. {
  19.     int daysInFullYears{0};
  20.     int currentYear=1600;
  21.     bool bissextile{0};
  22.     for (currentYear; currentYear<year; currentYear++)
  23.     {
  24.         bissextile =0;
  25.         if( ((currentYear%4==0)&&(currentYear%100!=0))||(currentYear%400==0)&&(currentYear%100==0) )
  26.         {
  27.             bissextile =1;
  28.         }
  29.         daysInFullYears +=(365+bissextile);
  30.     }
  31.     return daysInFullYears;
  32. }
  33. int MaDate::dIFM()    // calcul de daysInFullMonths : le nombre de jours total dans les mois pleins
  34. {
  35.     int daysInFullMonths{0};
  36.     std::array<int, 12>monthsTable;
  37.     monthsTable[0]=31; // janvier
  38.     monthsTable[1]=28;
  39.     monthsTable[2]=31;
  40.     monthsTable[3]=30; // avril
  41.     monthsTable[4]=31;
  42.     monthsTable[5]=30;
  43.     monthsTable[6]=31;
  44.     monthsTable[7]=31; // aout
  45.     monthsTable[8]=30;
  46.     monthsTable[9]=31;
  47.     monthsTable[10]=30;
  48.     monthsTable[11]=31; // decembre
  49.     int fullMonths=(month-1);
  50.     if( ((year%4==0)&&(year%100!=0))||(year%400==0)&&(year%100==0) )
  51.     {
  52.         monthsTable[1]=29;
  53.     }
  54.     for (int i{0}; i<fullMonths; i++)
  55.     {
  56.         daysInFullMonths+=monthsTable[i];
  57.     }
  58.     return daysInFullMonths;
  59. }
  60. std::string MaDate::amountAndFinalDay()
  61. {
  62.     std::array<std::string, 7> daysOfWeek;
  63.     daysOfWeek[0]="Vendredi";
  64.     daysOfWeek[1]="Samedi";
  65.     daysOfWeek[2]="Dimanche";
  66.     daysOfWeek[3]="Lundi";
  67.     daysOfWeek[4]="Mardi";
  68.     daysOfWeek[5]="Mercredi";
  69.     daysOfWeek[6]="Jeudi";
  70.     int daysFinalAmount = (daysInFullYears+daysInFullMonths+day);  // total du nb jours
  71.     std::string finalDay = daysOfWeek[daysFinalAmount%7];
  72.     return finalDay;
  73. }
  74. void MaDate::Display()
  75. {
  76.     std::cout << "\n Le " << day << "-" << month << "-" << year << " correspond a un "<< amountAndFinalDay() << std::endl << std::endl;
  77. }


Message édité par Lt Ripley le 01-12-2016 à 13:45:07
Reply

Marsh Posté le 01-12-2016 à 13:44:38   

Reply

Marsh Posté le 01-12-2016 à 14:50:55    

Bonjour !
 
La fonction amountAndFinalDay est de retour "void" dans le .h et std::string dans le .cpp :)
 
Idem pour dateEntry (void et bool)
De plus, dans le main, il manque les () à l'appel de la fonction Display.
Je n'ai pas vu d'autre chose ... (Mais, pour être un peu pointilleux, il faudrait déclarer "const" les méthodes qui ne modifient pas l'objet :les "get" et assimilés (p. ex. amountAndFinallyDat, Display, ...).
 
(Il y a d'autres raffinements qui pourraient être faits, mais chaque chose en son temps :) )
Bonne continuation !
 
 
 
 


---------------
On n'est jamais très fort pour ce calcul !
Reply

Marsh Posté le 01-12-2016 à 15:08:10    

Merci beaucoup, je vais regarder tout ça  :)

Reply

Marsh Posté le 01-12-2016 à 17:01:10    

Super ça fonctionne  
 
Il a aussi fallu que je refasse le projet dans code::blocks car je n'avais initialement pas coché debug ni release lors de la création des fichiers MaDate.h et .cpp et le compilo me disait "undefined reference to 'MaDate...' " alors j'ai googlé
 
Et puis j'ai ajouté qq réinitialisations sinon ça cumulait quand je playAgain
 
Là j'ai plus qu'un warning, un statement has no effect (non used value) mais c'est sur un for, et où je ne déclare rien...  [:gordon shumway]
 
Merci  :hello:  

Reply

Marsh Posté le 01-12-2016 à 19:37:50    

Lt Ripley a écrit :

Là j'ai plus qu'un warning, un statement has no effect (non used value) mais c'est sur un for, et où je ne déclare rien...  [:gordon shumway]

Si tu n'as rien à déclarer ;)  alors tu ne met rien tout simplement:

Code :
  1. for (; currentYear<year; currentYear++)

Tu peux même écrire

Code :
  1. for(;;) { /* code */ }

, tu auras alors une boucle sans fin.

Reply

Marsh Posté le 01-12-2016 à 21:16:55    

Génial
 
Merci rat de combat

Reply

Marsh Posté le 02-12-2016 à 16:58:55    

çà avance bien   :)  
quand tu seras satisfait, cherche les raffinements évoqués par Farian.

Reply

Marsh Posté le 02-12-2016 à 18:06:36    

Salut benriach
 
Pour l'instant je ne peux passer aucune fonction en const, j'ai essayé avec la fonction display, mais le compilateur me sort une erreur.  Je pense que c'est parceque dans display j'appelle la fonction amountAndFinalDay qui modifie les attributs.
 
Sinon j'ai fait sauter un attribut dont je n'avais pas besoin (un string) en mettant directement "return moncalcul" au lieu de "return monattribut"
 
Là ce que je vois que je peux faire c'est utiliser un type moins gourmand au lieu de int pour certains attributs.
 
Edit : Voici mon nouveau code :
 
main.cpp

Code :
  1. #include "MaDate.h"
  2. #include <iostream>
  3. #include <string>
  4. #include <array>
  5. // programme qui fait correspondre un jour de la semaine à une date. Basé sur le 01/01/1600
  6. // ========================================================================================
  7. int main() {
  8.     std::cout << "\n ===================================================" << std::endl;
  9.     std::cout << " Calcul du jour de la semaine en fonction d'une date" << std::endl;
  10.     std::cout << "\t\t Lundi a Dimanche" << std::endl;
  11.     std::cout << "\tFonctionne a partir du 1 - 1 - 1600" << std::endl;
  12.     std::cout << "\t    Par Harvey - Novembre 2016" << std::endl;
  13.     std::cout << " ===================================================" << std::endl;
  14.     MaDate D;
  15.     bool playAgain = true;
  16.     std::string pAgain = "";
  17.     while (playAgain)
  18.     {
  19.         if(D.dateEntry() )
  20.         {
  21.             D.display();
  22.         }
  23.         std::cout << "\n Nouveau calcul ? Taper O/N ";
  24.         std::cin >> pAgain;
  25.         if( (pAgain=="N" ) || (pAgain=="n" ) )
  26.         {
  27.             playAgain=false;
  28.         }
  29.     }
  30. }


 
MaDate.h

Code :
  1. #ifndef MADATE_H_INCLUDED
  2. #define MADATE_H_INCLUDED
  3. #include <string>
  4. class MaDate
  5. {
  6.     int day, month, year;  // entry
  7.     int daysInFullMonths, daysInFullYears, currentYear, fullMonths, daysFinalAmount;  // résultats
  8.     bool bissextile;
  9.     int dIFY(); //total de jours dans les années pleines (daysInFullYears)
  10.     int dIFM(); //total de jours dans les mois pleins
  11.     std::string amountAndFinalDay();// calcul final = nb de jours total et attribution du jour de la semaine
  12. public:
  13.     MaDate();
  14.     bool dateEntry();
  15.     void display();
  16. };
  17. #endif // MADATE_H_INCLUDED


 
MaDate.cpp

Code :
  1. #include "MaDate.h"
  2. #include <string>
  3. #include <array>
  4. #include <iostream>
  5. MaDate::MaDate()  // initialisations
  6. {
  7.     day = 0;
  8.     month = 0;
  9.     year = 0;
  10.     daysInFullYears = 0;
  11.     daysInFullMonths = 0;
  12.     currentYear = 1600;
  13.     bissextile = 0;
  14.     fullMonths = 0;
  15.     daysFinalAmount = 0;
  16. }
  17. bool MaDate::dateEntry()  // saisie de la date
  18. {
  19.     std::cout << "\n Entrez le jour (ex : 17) : ";
  20.     std::cin >> day;
  21.     std::cout << " Entrez le mois (ex : 04) : ";
  22.     std::cin >> month;
  23.     std::cout << " Entrez l'annee (ex : 1925) : ";
  24.     std::cin >> year;
  25.     return true;
  26. }
  27. int MaDate::dIFY()    // calcul de daysInFullYears : le nombre de jours total dans les années pleines
  28. {
  29.     daysInFullYears=0; // réinitialisations sinon ça cumule
  30.     currentYear=1600;
  31.     for (; currentYear<year; currentYear++)  // rien a déclarer donc un ; tout de suite
  32.     {
  33.         bissextile =0;
  34.         if( (((currentYear%4)==0)&&((currentYear%100)!=0)) || ((currentYear%400)==0)&&((currentYear%100)==0) )
  35.         {
  36.             bissextile =1;
  37.         }
  38.         daysInFullYears +=(365+bissextile);
  39.     }
  40.     return daysInFullYears;
  41. }
  42. int MaDate::dIFM()    // calcul de daysInFullMonths : le nombre de jours total dans les mois pleins
  43. {
  44.     daysInFullMonths=0;
  45.     std::array<int, 12>monthsTable;
  46.     monthsTable[0]=31; // janvier
  47.     monthsTable[1]=28;
  48.     monthsTable[2]=31;
  49.     monthsTable[3]=30; // avril
  50.     monthsTable[4]=31;
  51.     monthsTable[5]=30;
  52.     monthsTable[6]=31;
  53.     monthsTable[7]=31; // aout
  54.     monthsTable[8]=30;
  55.     monthsTable[9]=31;
  56.     monthsTable[10]=30;
  57.     monthsTable[11]=31; // decembre
  58.     fullMonths=(month-1);
  59.     if( ((year%4==0)&&(year%100!=0))||(year%400==0)&&(year%100==0) )
  60.     {
  61.         monthsTable[1]=29;
  62.     }
  63.     for (int i{0}; i<fullMonths; i++)
  64.     {
  65.         daysInFullMonths+=monthsTable[i];
  66.     }
  67.     return daysInFullMonths;
  68. }
  69. std::string MaDate::amountAndFinalDay()
  70. {
  71.     std::array<std::string, 7> daysOfWeek;
  72.     daysOfWeek[0]="Vendredi";
  73.     daysOfWeek[1]="Samedi";
  74.     daysOfWeek[2]="Dimanche";
  75.     daysOfWeek[3]="Lundi";
  76.     daysOfWeek[4]="Mardi";
  77.     daysOfWeek[5]="Mercredi";
  78.     daysOfWeek[6]="Jeudi";
  79.     daysFinalAmount = (dIFY()+dIFM()+day);  // total du nb jours
  80.     return daysOfWeek[daysFinalAmount%7];
  81. }
  82. void MaDate::display()
  83. {
  84.     std::cout << "\n Le " << day << "-" << month << "-" << year << " correspond a un "<< amountAndFinalDay() << std::endl << std::endl;
  85. }


Message édité par Lt Ripley le 06-12-2016 à 11:05:30
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed