Orienté Objet

Fermé
MonCplusplus Messages postés 21 Date d'inscription lundi 23 avril 2018 Statut Membre Dernière intervention 9 mars 2019 - 14 déc. 2018 à 00:42
MonCplusplus Messages postés 21 Date d'inscription lundi 23 avril 2018 Statut Membre Dernière intervention 9 mars 2019 - 27 déc. 2018 à 04:48
Bonjour, alors vois voilà j'ai commencé à m'intéresser à la programmation orienté objet cependant certains points ambiguë m'interpelle non pas sur des cas concrets mais sur des points "Théoriques" à savoir:

1)La Redéfinition des Opérateurs (surcharges) : Certes il est possible en c++ de redéfinir un ensemble d'opérateur tel que l'opérateur de décalage(shift) permettant d'afficher (<<) ou d'entrer (>>) différentes valeurs pour des objets cependant j'ai du mal à assimilé l'opérateur de comparaison (==) en effet il est possible de comparer des objets cependant à l' instar des autres opérateurs que j'ai cité il n'est possible que de comparé 2 objets à la foi pour l'opérateur de comparaison n'est-il pas possible de comparer plusieurs objet à la fois en re définissant l'opérateur ? Genre pouvoir faire : obj1==obj2==obj3? Pcq il me semble que sur certains opérateurs il est possible de faire un appel dis en "cascade" mais pas sur tout pourquoi ?

2)Table d'objet statique: j'ai également du mal à comprendre pourquoi en créant une table d'objet statique genre Jouet jouets[10] // table de 10 objet jouets il n'est pas possible par exemple de construire un objet de cette maniere Jouet jouet[0]("guerrier", "peluche") ; // On suppose dans la classe Jouet qu'un constructeur à été défini avec 2 paramètres. Donc construire un objet avec un constructeur "spéciale" défini au préalable, ce qui est troublant c'est que il est tout à fait possible de le faire avec des objet dynamiques Jouet *jouet[10]; jouet[0]= new Jouet("guerrier", "peluche").


Merci d'avance pour vos éventuelles interventions et éclaircissements.

1 réponse

Dalfab Messages postés 706 Date d'inscription dimanche 7 février 2016 Statut Membre Dernière intervention 2 novembre 2023 101
14 déc. 2018 à 14:41
Bonjour,

1. redéfinition des opérateurs
Aucun opérateur n'a un mode "cascade".
Si on écrit
std::cout << "hello " << "world";
, un regroupement est effectué, il est de gauche à droite pour l'opérateur
<<
, il se produit donc
(std::cout << "hello ") << "world";
, le résultat de l'opérateur retransmets son membre gauche, d'où c'est équivalent à :
std::cout << "hello ",
std::cout << "world";

Pour l'opérateur égal, lui aussi a un regroupement à gauche.
obj1==obj2==obj3
est donc vu
(obj1==obj2)==obj3
. On compare donc obj1 et obj2, et son résultat (qui est true ou false) est ensuite comparé à obj3, ce qui a rarement un sens. Si on essaie
if ( 1 == 2 == 0 )
, cela est vrai! car devient
if (  (1==2) == 0 )
donc
if ( false == 0 )
donc
if ( 0 == 0 )
.

Conclusion pour certain opérateurs, c'est possible de les cascader. Pour d'autre ça doit être impérativement évité, si on veut 2 tests d'égalité on les écrits :
if ( 1==2 && 2==0 )
.

2. Table d'objets statiques
On peut tout à fait initialiser les tableaux et les éléments de tableau. Il faut cependant bien comprendre ce qu'il se passe.

class Jouet {
public:
   Jouet() {} // cas d'un Jouet sans caractéristique connue
   Jouet( std::string type , std::string forme );
};
int main() {
   Jouet jouets[2] { Jouet("guerrier","peluche") , Jouet("guerrier","peluche") }; // Ok
   Jouet autre[10];  // ok on a pu construire 10 jouets de caractéristiques inconnues (constructeur par défaut)
   jouets[0] = Jouet("guerrier","peluche"); // ok on a copié un nouveau jouet dans le jouet du tableau (constructeur à 2 paramètres, suivi de l'opérateur de copie)
   jouets[1] = {"voiture", "plastique"};    // marche aussi depuis 2011
   Jouet etAussi[2] { {"guerrier","peluche"} , {"voiture","plastique"} }; // Ok depuis 2011
}
Si on supprime la ligne 3, alors la ligne 8 ne compilera plus car on sera incapable de construire des objets sans avoir les données de construction.
0
MonCplusplus Messages postés 21 Date d'inscription lundi 23 avril 2018 Statut Membre Dernière intervention 9 mars 2019
16 déc. 2018 à 07:23
Merci pour tes remarques pertinentes, je vois un peu plus clair en ce qui concerne les opérateurs, mais pour ce qui est des tableaux si je comprend bien on a pas d'autre choix que de crée un objet de la table d'objet en passant par des copie d'objets... Donc lors de l'appel du constructeur en memoir il n'y a pas 1 seul objet qui intervient mais 2 puisque le constructeur de copie est appelé et que par conséquent il crée à nouveau un objet pour copier membre à membre les donnés à l'objet qu'on souhaite crée. Ce qui m'intrigue d'avantage c'est que si il ne s'agissait pas de tableau d'objet statistique mais simplement un objet statique c'est à dire Jouet j j'aurais très bien pu faire j("peluche","robot"), je veux dire que c'est que lors de l'utilisation de tableaux d'objet statistique que la syntaxe change....
0
Dalfab Messages postés 706 Date d'inscription dimanche 7 février 2016 Statut Membre Dernière intervention 2 novembre 2023 101
16 déc. 2018 à 09:56
Je ne comprends pas tes exemples. Si un objet existe, il a du être initialisé que ce soit dans une variable ou dans un tableau. Pour lui donner une autre valeur, l'opérateur de copie devra être utilisé. il n'y a pas de vraiment de différence entre un tableau de 1 et une simple variable. Donne un exemple où c'est différent selon toi.

Si on utilise une collection de taille adaptative (donc toutes sauf le tableau), là on pourra créer l'objet au moment opportun.
std::vector<Jouet>  vv;
vv.reserve( 4 );    // pour le moment on a la place pour 4 mais aucun objet n'est créé
vv.emplace_back("guerrier","peluche"); // création dans le vector
vv.emplace_back("guerrier","peluche"); // autre création dans le vector
vv.resize( 5 ); // on a forcé 5 objets, donc 3 Jouet de plus ont été construits par défaut
0
MonCplusplus Messages postés 21 Date d'inscription lundi 23 avril 2018 Statut Membre Dernière intervention 9 mars 2019
27 déc. 2018 à 04:48
Merci pour l'éclaircissement, je n'ai pas d'exemple concret pour le moment mais je ne manquerai pas de te le faire savoir le moment où je serai confronté à ce genre de problème Merci encore !.
0