Petit problème d'héritage...

Signaler
Messages postés
40
Date d'inscription
dimanche 30 janvier 2005
Statut
Membre
Dernière intervention
17 août 2007
-
Messages postés
518
Date d'inscription
dimanche 2 décembre 2001
Statut
Membre
Dernière intervention
10 novembre 2007
-
Bonjour tout le monde,
Voila comme l'indique le sujet j'ai un petit problème avec l'histoire de classe dérivées.
    - j'ai une classe mère qui contient des données de type Protected (par exemple: Nom, Prénom)
    - j'ai un tableau d'objet de la classe mère, tabO[10] par exemple
    - une classe fille
Dans la classe fille je voudrais pouvoir accéder au membre protected de la classe mere (mais je sais pas trop comment ca marche..)
pour cela j'ai appliqué cette méthode :
dans la classe mere j'ai un fontion"Quel_Nom()"qui me retourne le Nom.
voici ce que je voudrais faire à partir de la classe fille:

cout << "entrez votre nom";
cin >> tabO[n].Quel_Nom();

Mais ca me fait une megas erreur du genre :

ambiguous overload for 'operator>>' in 'std::cin >> ((+(((unsigned int)n) * 116u)) + ((Orchestre*)(&tabO)))->Orchestre::quel_nom()'

du coup j'ai tentais autrement :

cout << "entrez votre nom";

cin >> tabO[n].Nom;

Mais toujours une erreur :

`char Orchestre::Nom[20]' is protected

Voila maintenant je sais plus comment faire avez vous une idée ? je sais ca doit être tout bête comme soluce mais franchement je trouve po !
Merci d'avance ++

piou ('<>')

13 réponses

Messages postés
987
Date d'inscription
mardi 31 mai 2005
Statut
Membre
Dernière intervention
30 août 2012
21
Dans ta classe fille tu peut faire une fonction public setNom(string  n){ Nom = n;}
apres tu fait
string temp;
 cin >> temp;
tabO[n].setNom(temp);

++
Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
7
Visiblement c'est pas une classe fille, car normalement une classe
fille à accès au données protégées de la classe mère (seules les
données privées sont incaccessibles).
cin >> tabO[n].Quel_Nom();
Cela n'a pas de sens, car Quel_Nom() est, en gros, une constante.
Messages postés
987
Date d'inscription
mardi 31 mai 2005
Statut
Membre
Dernière intervention
30 août 2012
21
cin >> tabO[n].Nom; ne peut pas marcher car, Nom est un membre protegé, donc de l'exterieur de la classe on n'a pas d'accès à ce membre d'ou le message

Nom[20]' is protected
++
Messages postés
40
Date d'inscription
dimanche 30 janvier 2005
Statut
Membre
Dernière intervention
17 août 2007

oui vecchio56 Quel_Nom() est une constante mais je pense que c'est bien une classe fille que j'ai faite (d'apres le cours que j'ai vu sur le net) :
classe mere :

class Orchestre
{
      public :
             void initF(); //initialise le tableau par rapport a ce que contient le fichier.
             void affichertout(); //affiche tout les membres de l'Orchestre
             void afficher(); // pour afficher ce qu'il y a dans le tableau
             const int    quel_num()const ;
             const int    nbre_inter()const;
             const char * quel_nom()const;
             const char * quel_prenom()const;
             const char * quel_adresse()const;
             const char * quel_tel() const;
             int p; //position du dernier enregistrement
      protected :              
              int  Num;
              int  Nbre;
              int  Type; // 1-> Chef, 2-> Musicien, 3->Intermitants
              char Nom[20];
              char Prenom[15];
              char Adresse[50];
              char Tel[12];
}; 
 
Classe fille :

class Musicien : public Orchestre // classe fille de Orchestre
{
      public :
              void ajouter();
              void suppr();
              void modifier();
              void afficher();
             
      private :
              char libelle[20];
              int nbre_musc;       

}
Merci Laurent1024 mais j'arrive pas non plus avec ta méthode.. je comprend pas pourquoi ca veut pas ! dans tout ce que j'ai lu il y a marqué que protected c'est pour la classe mere et pour les classes dérivées.. bizare..
Merci de m'avoir répondu va falloir que je creuse le ciboulot encore un tout petit peu

piou ('<>')
Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
7
Si le code en question est dans une classe fille (comme le précise le
message initial), on peut très bien accéder au membre public (à
condition de faire un héritage publique)
Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
7
Non j'ai déliré, même pas besoin d'un héritage publique (je connais pas trop, j'utilise tout le temps l'héritage publique).

Je ne vois pas la déclaration de tabO


Voila un exemple qui montre qu'on peut accéder à une membre protégé sans pb dans une classe fille:


class Mere

{

protected:

  int n;

};


class Fille: Mere

{

  void f() {n = 0;}

};


int main()

{

}
Messages postés
40
Date d'inscription
dimanche 30 janvier 2005
Statut
Membre
Dernière intervention
17 août 2007

oui oui le code est dans la classe fille et c'est pouquoi j'ai voulu utiliser :

const char * quel_nom()const
{
    return Nom;
};
comme membre public afin de pouvoir l'utiliser dans ma classe fille mais apparement ca suffit pas

piou ('<>')
Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
7
Mais justement tu n'en a pas besoin (et puis de toute facons on
n'affecte pas une fonction, ca na pas de sens). Je t'explique que le `char Orchestre::Nom[20]' is protected
n'est pas logique, donc tu n'est sans doute pas dans la classe fille.
Si tu veux montrer ton code on pourra peut être avancer un peu
Messages postés
40
Date d'inscription
dimanche 30 janvier 2005
Statut
Membre
Dernière intervention
17 août 2007

class Orchestre
{
      public :
             void initF(); //initialise le tableau par rapport a ce que contient le fichier.
             void affichertout(); //affiche tout les membres de l'Orchestre
             void afficher(); // pour afficher ce qu'il y a dans le tableau
             const int    quel_num()const ;
             const int    nbre_inter()const;
             const char * quel_nom()const;
             const char * quel_prenom()const;
             const char * quel_adresse()const;
             const char * quel_tel() const;
             int p; //position du dernier enregistrement
      protected :              
              int  Num;
              int  Nbre;
              int  Type; // 1-> Chef, 2-> Musicien, 3->Intermitants
              string Nom;
              char Prenom[15];
              char Adresse[50];
              char Tel[12];
};     
      
Orchestre tabO[100]; //tableau d'objet de la classe mere Orchestre

class Musicien : public Orchestre // classe fille de Orchestre
{
      public :
              void ajouter();
              void suppr();
              void modifier();
              void afficher();
              /*void setNom(string no,int n)
              {
                   tabO[n].Nom = no;
              };*/
      private :
              char libelle[20];
              int nbre_musc;
};

void Musicien::ajouter()
{
     string temp;
     Orchestre O;
     int rep,n;
     rep = 1;
     n = p-1; //se positione dans le tableau sur le prochain enregistrement
     while (rep == 1)
      {
       clrscr();
       textcolor (10);
       cout << " _____________________________________________\n";
       cout << "|       1. Fiche de saisie d'un Musicien       |\n";
       cout << " ---------------------------------------------\n";
       cout << endl;
       n++;
       textcolor(11);
       cout << "Entrez le nom du Musicien (max 10 caractères) \n";
       textcolor(14);
       /*cin >> temp;
       setNom(temp);*/
       tabO[n].quel_nom();
       textcolor(11);
       cout << "Veuillez saisir son prenom (max 10 car): \n";
       textcolor(14);
       cin  >> tabO[n].quel_prenom() ;
       textcolor(11);
       cout << "son numeros de telephone : \n";
       textcolor(14);
       cin  >> tabO[n].quel_tel() ;
       textcolor(11);
       cout << "son adresse : \n";
       textcolor (14);
       cin  >> tabO[n].quel_adresse() ;
       textcolor(11);
       cout << "Veuillez indiquer l'instrument dont il joue \n";
       textcolor(14);
       cin >> tabM[n].quel_libelle() ; 
              
       textcolor (11);
       cout << "Voulez vous remplir une autre fiche de personnel (0/1) ?\n";
       textcolor (14);
       cin  >> rep ;
      }
     
       if (rep == 0)
      {
               ofstream personnel;
               personnel.open("Orchestre.txt", ios::out|ios::trunc);
               for (int i = 0; i <= Nbre ; i++)
               {
                if (personnel.bad())
                return 1;
                personnel << i+1 << endl << tabO[i].Nom << endl << tabO[i].Prenom << endl << tabO[i].Tel << endl
                                << tabO[i].Adresse << endl << tabM[i].libelle << endl;
               }
             personnel.close();
             textcolor (6);
             clrscr();
            
      }
};
Voila en clair ce que je veux faire saisir des informations les stockées dans un tableau pour ensuite toutes les enregistrer dans un fichier .txt.
encore désolée mais je débute en c++ du coup c'est pas facile pour moi..merci de m'aider

piou ('<>')
Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
7
D'accord, c'est moi qui ai faux depuis le début. On peut pas y accéder,
car on ne peut accéder au donnée protégées que de this (pas des autres
objets).

Tu peux utiliser la méthode setNom comme te l'a proposé laurent1024
Messages postés
987
Date d'inscription
mardi 31 mai 2005
Statut
Membre
Dernière intervention
30 août 2012
21
De plus, j'arrive pas a comprend ta relation d'héritage entre orchestre et musicien.
Personnellement, je ferais des methode dans la classe orchestre, pour pouvoir modifier, les différents champs protegé. La classe musicien n'a pas besoin de deriver de la classe orchestre. Il faut que tu fasse une classe musicien qui contient le tableau tab0 et le methode que tu as definis (ajout, modification, .....)

++
Messages postés
40
Date d'inscription
dimanche 30 janvier 2005
Statut
Membre
Dernière intervention
17 août 2007

merci pour vos réponses
enfet Laurent1024 j'ai une classe orchestre mere puis deux classe derivée musiciens et intermitant (pour que ca fasse des spécialisations) je dois, pour evaluer une compétence en objet pour mon examen, absolument faire une dérivation du coup je m'y suis prise comme ca en me disant que si je pouvais montrer des possibilités qui existent avec les classes.
++

piou ('<>')
Messages postés
518
Date d'inscription
dimanche 2 décembre 2001
Statut
Membre
Dernière intervention
10 novembre 2007
3
Salut, ton raisonnement n'est pas bon, ce qu' "il faut" faire:

class Personne {
public:
Personne(); // id = ++idPers;
Personne(const string & nom,const string & prenom, const string & adresse, const string & tel);

void setNom(const string&);
void setPrenom(const string&);
void setAdresse(const string&);
void setTel(const string&);

string getNom();
string getPrenom();
string getAdresse();
string getTel();
int getType();

void lierAOrchestre(Orchestre o) {
....
lstOrchestre.push_back(o);
}

private:
vector<Orchestre> lstOrchestres;
string nom;
string prenom;
string adresse;
string tel;
int id;
static int idPers; // initialisé à 0

protected:
int type
};

class Musicien : public Personne {
public:
Musicien() { type = ...;}
};

class Intemittant : public Personne {
public:
Musicien() { type = ...;}
};

class Orchestre {
public:
Orchestre() { num = ++dernierNum}
int getNum();
void ajouterPersonne(Personne p) {
lstPersonnes.push_back(p);
}

private:
static int dernierNum; //Initialisé à 0
int num;
vector lstPersonne;
};

Chaque Orchestre possède une liste de personnes, chaque personne effectue des activités dans plusieurs Orchestres, les Orchestres et les personnes ont des identifiants (num et id). Le type de personne est initialisé dans Musicien et Intermittant. Enfin, voilà, quelque chose de plus proche de la réalité. As tu pigée le truc ?

Bonne chance.

Bouba