_deadstar_
Messages postés40Date d'inscriptiondimanche 30 janvier 2005StatutMembreDernière intervention17 août 2007
-
28 mai 2006 à 16:17
cs_bouba
Messages postés518Date d'inscriptiondimanche 2 décembre 2001StatutMembreDernière intervention10 novembre 2007
-
29 mai 2006 à 11:17
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:
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 ++
vecchio56
Messages postés6535Date d'inscriptionlundi 16 décembre 2002StatutMembreDernière intervention22 août 201014 28 mai 2006 à 16:41
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.
cs_laurent1024
Messages postés987Date d'inscriptionmardi 31 mai 2005StatutMembreDernière intervention30 août 201225 28 mai 2006 à 16:50
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
_deadstar_
Messages postés40Date d'inscriptiondimanche 30 janvier 2005StatutMembreDernière intervention17 août 2007 28 mai 2006 à 16:54
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 ('<>')
Vous n’avez pas trouvé la réponse que vous recherchez ?
vecchio56
Messages postés6535Date d'inscriptionlundi 16 décembre 2002StatutMembreDernière intervention22 août 201014 28 mai 2006 à 16:55
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)
vecchio56
Messages postés6535Date d'inscriptionlundi 16 décembre 2002StatutMembreDernière intervention22 août 201014 28 mai 2006 à 17:06
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
_deadstar_
Messages postés40Date d'inscriptiondimanche 30 janvier 2005StatutMembreDernière intervention17 août 2007 28 mai 2006 à 17:15
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 ;
}
}
};
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
vecchio56
Messages postés6535Date d'inscriptionlundi 16 décembre 2002StatutMembreDernière intervention22 août 201014 28 mai 2006 à 17:20
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
cs_laurent1024
Messages postés987Date d'inscriptionmardi 31 mai 2005StatutMembreDernière intervention30 août 201225 28 mai 2006 à 17:29
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, .....)
_deadstar_
Messages postés40Date d'inscriptiondimanche 30 janvier 2005StatutMembreDernière intervention17 août 2007 28 mai 2006 à 22:41
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.
++
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 ?