|
|
|
|
Bonjour,
je nage en plein desespoir, je dois rédiger un programme d'info en C++ et j'ai beaucoup de lacunes ! C'est pourquoi ma question n'est pas très bien ciblée d'ailleurs...
Alors, pour commencer, on me demande de créer un fichier avec une classe mère et plusieurs classes filles. (là, ca va.)
La classe mère contient pour information une chaine de caractères qui définit une opération précise, et par conséquent la classe fille à utiliser. (comment je fais pour désigner quelle classe fille utiliser à partir d'une chaine de caractère donnée dans la classe mère ?)
La classe mère contient une fonction membre commune, mais qui n'est pas la même selon la classe fille désignée . Comment dois je faire pour qu'une fonction commune change pour chaque classe fille ?
Alors voilà, je sais pas si ma question est très claire :s
Et sinon, je me demandais, est il possible de prendre une classe comme argument de fonction ?
A l'avance, merci beaucoup...
Configuration: Windows XP Firefox 2.0.0.1
C'est assez bizarre comme manière de faire, normalement on fait plutôt des liens dynamiques avec du virtual et tout le bastringue si on a une instance de la classe mère pour retomber sur la bonne classe fille.
#include <iostream>
#include <string>
#include <cassert>
class a_t{
protected:
std::string machaine;
public:
a_t(const std::string & machaine0="b1"):
machaine(machaine0)
{
assert(machaine=="b1" || machaine=="b2");
}
inline const std::string & get_machaine() const{
return machaine;
}
};
class b1_t : public class a_t{
public:
b1_t(){}
inline void f() const {
std::cout << "b1" << std::endl;
}
};
class b2_t : public class a_t{
public:
b2_t(){}
inline void f() const {
std::cout << "b2" << std::endl;
}
};
void mafonction(a_t & x){
if(x.get_machaine() == "b1"){
const b1_t & x_cast = std::static_cast<b1_t>(x);
x_cast.f();
}else if(x.get_machaine() == "b1"){
const b2_t & x_cast = std::static_cast<b2_t>(x);
x_cast.f();
}
}
Bone j'ai pas testé mais je pense que ça doit marcher, ou quelque chose dans ce goût là, je te laisser chercher... Bonne chance |
Salut.
|
C'est à nouveau moi :(
class foret : public outil //dérive de outil, devra modifier le diametre intérieur de la piece
{
public :
foret();
~foret();
void foret::usinage(piece p1, double epaisseur)
{
outil::usinage ( p1, epaisseur);
cout <<"la dimension qui sera modifiee est le diametre interieur \n";
modif = p1.dint;
}
};
voila. qu'est ce que je dois faire pour corriger ca ? sinon, pour le code que tu m'as donné, j'ai essayé de le faire marcher, mais je ne connais pas certaines écritures que tu utilises, comme ce que signifie le & quand tu écris void mafonction(a_t & x)ou ce que signifie const b1_t & x_castet quand je compile, il dit expected unqualified-id before "static_cast" qu'est ce qu'un "unqualified-id" ? j'ai vraiment beaucoup de mal... |
Tu définis un constructeur mais tu n'as pas donné le corps de la fonction :
class foret{
protected:
unsigned int nb_arbre;
public:
foret(unsigned int nb_arbre0):nb_arbre(nb_arbre0){}
~foret(){}
//...
};
- Une fonction virtuelle c'est une fonction que l'on peut redéfinir dans une classe fille. http://ltiwww.epfl.ch/Cxx/c2_7.html - Attention à bien écrire std::cout et non cout, car a priori ta classe est définie dans un .hpp et il ne faut donc pas faire de "using namespace std;". Bonne chance |
Dans : type fonction(type & variable) le & signifie un passage par référence.
|
A quoi sait t'on qu'il faut utiliser un fichier.hpp a la place d'un fichier .h ?
|
Concernant mon programme, ca a l'air de marcher, donc je n'ai plus de questions, (je crois !) Merci !
|
Ah en fait, j'ai une autre question ! (désolé !)
piece finie (lpf,dextpf,dintpf);lpf,dextpf,dintpf sont des valeurs numériques déjà "préenregistrées", mais si elles ne conviennent pas à l'utilisateur, il doit pouvoir les modifier. donc voilà, je lui fais entrer ses valeurs à lui pour lpf,dextpf,dintpf, mais après, si je réaffiche les valeurs de piece brute, ce sont les premières qu'il me sort... Comment faire pour qu'il prennent en compte les modifications de lpf,dextpf,dintpfqui ont été faites ? Merci...
|
Bon pour la première question il faut bien faire la distinction entre la variable ou tu stocke la saisie de l'utilisateur et celle de l'objet lui-même. En général on met en protected les attributs de classe qui sont initialisées définitivement par le constructeur. Les autres peuvent être mises en public mais c'est mieux de les mettre en protected avec des accesseurs. Exemple :
#include <iostream>
class plop{
protected:
int x;
int y;
public:
plop(const int & x0=0,const int & y0=0):x(x0),y(y0){}
// lecture seule
inline const int & get_x() const {
return x;
}
// lecture seule
inline const int & get_y() const {
return x;
}
// si tu au
inline void set_x(const int & x0){
x=x0;
}
inline void set_y(const int & y0){
y=y0;
}
};
int main(){
std::cout << "x0 ?" << std::endl;
std::cin >> x0;
std::cout << "y0 ?" << std::endl;
std::cin >> y0;
plop p(6,9);
p.set_x(x0);
p.set_y(y0);
std::cout << "p.x=" << p.get_x() << std::endl;
std::cout << "p.y=" << p.get_y() << std::endl;
return 0;
}
Pour les toc utilises des std::string et l'opérateur == ce sera beaucoup plus simple. Bonne chance |