#include #include #include #include using namespace std; //-- void petitNom(const string& className, string& varPetitNom) { if (className.length()==0) { cerr << "petitNom: Nom de classe vide!"<< endl; } char firstLetter = toupper(className.at(0)); if (firstLetter=='A'||firstLetter=='E'||firstLetter=='I' || firstLetter=='O'||firstLetter=='U'||firstLetter=='Y') varPetitNom="an"; else varPetitNom="a"; varPetitNom += firstLetter; } //-- void transformeMajuscules(const string& src, string& dest) { dest = src; for(size_t i=0; i> str; } } //-- void saisieSize_t(const string& mess, size_t &val) { int ok = 0; while (ok!=1) { string saisie; unsigned int entier; saisieString(mess,saisie); ok = sscanf(saisie.c_str(),"%ud",&entier); val = entier; } } //-- void usage(int argc,char **argv) { (void)argc; cerr << endl; cerr << "Usage : " << argv[0] << "[-tn] ClassName" << endl; cerr << endl; cerr << "L'eventuelle option -t (classe template) est suivie d'un nombre n."; cerr << endl; cerr << "Ce nombre n correspond aux nombres de classes " << "parametrant ClassName."; cerr << endl; cerr << endl; } //-- int main(int argc, char **argv) { if (argc==1 || argc > 3) { usage(argc,argv); return 1; } // Pas d'argument ou trop d'arguments ! bool classTemplate = false; string allArgs=""; for(int i=0;i0) classTemplate = true; for(int i=argc-1; i>1; i--) { argv[i-1] = argv[i]; } argv[argc-1]=NULL; argc--; } if (classTemplate) cout << endl << "Class Template" << endl << endl; else cout << endl << "Class non Template" << endl << endl; if (argc!=2) { usage(argc,argv); return 1; } // Deux classes ? string className; string CLASSNAME; string classNameT; // Comme classeName mais avec eventuellement du template string varName; string decName; string decName1; string decName2; string decNames12; size_t nbBaseClasses; vector baseClasses; string templateClassList=""; string templateList=""; if (classTemplate) { if (nbTemplate==1) { templateClassList="template "; templateList=""; } else { templateClassList="template <"; templateList="<"; for(int i=1; i<=nbTemplate; i++) { ostringstream iToString; iToString << i; string s = "T"; s = s + iToString.str(); templateClassList+="class "+s; templateList+=s; if (i!=nbTemplate) { templateClassList+=", "; templateList+=","; } } templateClassList+=">"; templateList+=">"; } } if (argc==1) saisieString("Nom de la classe ? ",className); else className = argv[1]; transformeMajuscules(className,CLASSNAME); petitNom(className,varName); classNameT = className+templateList; decName = "const "+classNameT+"& "+varName; decName1 = decName+"1"; decName2 = decName+"2"; decNames12 = decName1+", "+decName2; saisieSize_t("Nombre de classes dont la classe "+className+" herite ? ", nbBaseClasses); for(size_t i=0; i" << endl; if (baseClasses.size()!=0) oh << endl; for(size_t i=0;i(ostream& os, "+decName+");"<< endl; } else { oh << " friend ostream& operator<<(ostream& os, "+decName+");" << endl; } oh << endl; oh << " public :" << endl; oh << endl; oh << " // Allocateurs/Desallocateurs" << endl; oh << endl; oh << " "+className+"( /* ### */ );" << endl; oh << " "+className+"("+decName+");" << endl; oh << " "+classNameT+"& operator=("+decName+");" << endl; oh << " virtual ~"+className+"(void);" << endl; oh << endl; oh << " // Comparaisons" << endl; oh << endl; if (classTemplate) { oh << " friend bool operator== <>("+decName1+"," << endl; oh << " "+decName2+");" << endl; oh << " friend bool operator!= <>("+decName1+"," << endl; oh << " "+decName2+");" << endl; } else { oh << " friend bool operator==("+decNames12+");" << endl; oh << " friend bool operator!=("+decNames12+");" << endl; } oh << endl; oh << " // Inspecteurs/modificateurs" << endl; oh << endl; oh << " protected :" << endl; oh << endl; oh << " // Methodes a appeler par une classe derivee" << endl; oh << endl; oh << " // display: a appeler dans une classe derivee" << " // display est une" << endl; oh << " virtual void display(ostream& os) const;" << " // methode appelee" << endl; oh << " " << " // dans operator<<" << endl; oh << endl; oh << " // isEqualTo: a appeler dans une classe derivee (dans operator==)"; oh << endl; oh << " bool isEqualTo("+decName+") const;" << endl; oh << endl; oh << " protected :" << endl; oh << endl; oh << " // ###" << endl; oh << endl; oh << " private :" << endl; oh << endl; oh << " // ###" << endl; oh << endl; oh << " private :" << endl; oh << endl; oh << " // Methodes privees d'allocation/desallocation" << endl; oh << endl; oh << " void _copy("+decName+");" << endl; oh << " void _destroy(void);" << endl; oh << "};" << endl; oh << endl; oh << "#endif // _"+CLASSNAME+"_H_" << endl; oh.close(); // Ecriture du .cpp /////////////////// ofstream oc((className+".cpp").c_str()); if (oc.fail()) { cerr << "Erreur ouverture fichier " << className+".cpp" << endl; return 1; } // L' include ///////////// oc <<" // Fichier genere avec "<< allArgs << endl; oc << "#include \""+className+".h\"" << endl; oc << endl; // Le constructeur ////////////////// oc << "//--" << endl; if (classTemplate) oc << templateClassList << endl; oc << classNameT+"::"+className+"( /* ### */ )"; if (baseClasses.size()!=0) oc << " : "; for(size_t i=0;i