Bonjour
Dans le livre de Scott Meyers, Effective C++, il y a un truc bizarre. Dans cette classe (cf Item 16)
Il dit bien qu'il faut assigner l'objet pointé par ptr, pas le pointeur lui-même, dans la définition de l'opérateur =.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28 template<class T> // template for classes associating class NamedPtr { public: NamedPtr(const string& initName, T *initPtr); NamedPtr& operator=(const NamedPtr& rhs); int get(int ); private: string name; T *ptr; }; template<class T>int NamedPtr<T>::get(int o){ return this->ptr[o]; } template<class T> NamedPtr<T>::NamedPtr(const string& initName, T *initPtr ) : name(initName), ptr(initPtr) {} template<class T> NamedPtr<T>& NamedPtr<T>::operator=(const NamedPtr<T>& rhs) { if (this == &rhs) return *this; // assign to all data members name = rhs.name; // assign to name *ptr = *rhs.ptr;//for ptr, assign what's pointed to, not te pointer itself. return *this; }
Alors j'ai essayé moi-même sa classe:
et on voit bien dans ce cas là, que le renvoie du premier cout est 1, mais le second n'est pas 3, mais 33.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 int main(){ int *o=new int[2]; int *p=new(int[2]); o[0]=1;o[1]=3; p[0]=10;p[1]=33; NamedPtr<int> A("ee",o); NamedPtr<int> B("ede",p); B=A; cout<<B.get(0); cout<<B.get(1); }
Ensuite, j'ai supprimé les deux déférences, et j'ai obtenu comme renvoie 0 et 3.
Je suis perplexe là, car je pense que son intention, c'est bien de faire en sorte que A et B soient égaux. Donc les données membres aussi.
Partager