Bonjour

Dans le livre de Scott Meyers, Effective C++, il y a un truc bizarre. Dans cette classe (cf Item 16)
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; 
}
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 =.

Alors j'ai essayé moi-même sa classe:
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);
}
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.
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.