Ajouter un commentaire

fredericmazue

Quote:
Or j'ai lu :

Ou ça :?: :!:
Quote:
Il est rare de recevoir une référence non const en paramètre

Si seulement...
Quote:
Un paramètre pointeur constant représente toujours un tableau

N'importe quoi...
Quote:
Il ne faut pas utiliser les références comme attribut d'un objet.

Et pourquoi pas ?

Quote:
Comment lier le paramètre avec la donnée membre sans avoir à faire une copie d'objet et donc le plus propre possible ?

Si l'instance d'InformationsBase est sur le tas, un auto_ptr est toujours une solution sympa. Voir Recept1 ci-dessous. Mais attention Recept1 ne va que si elle n'est pas copiée à son tour :!: (A cause de l'auto_ptr)
Dans les cas plus complexes, utiliser par exemple boot:shared_ptr (que je n'utilise moi même jamais)
Si l'instance de InformationsBase est sur la pile, pas de problème avec les références membres. Voir ci dessous Recept2. Mais attention l'objet référencé ne doit pas être détruit par une sortie de portée évidemment.

#include <iostream>
#include <memory>
#include <string>

using namespace std;


class InformationsBase  
{
private:
 std::string info1; 
public: 
	InformationsBase(string s) : info1(s) {}
	~InformationsBase() {cout << info1 << " destruction" << endl;}
	void hello() const {cout << info1 << endl;}
}; 

class Recept1
{ 
private : 
   auto_ptr<const InformationsBase> inner_b;
public :
	Recept1(const InformationsBase* const b) : inner_b(b) {}
	void hello() {inner_b->hello();}
};

class Recept2
{ 
private : 
   const InformationsBase& inner_b;
public :
	Recept2(const InformationsBase& b) : inner_b(b) {}
	~Recept2() {cout << "detenteur reference: destruction" << endl;}
	void hello() {inner_b.hello();}
};

int main(int argc, char* argv[])
{
	// 1ere possibilité
	Recept1 r1(new InformationsBase("ib pointeur"));
	r1.hello();

	// 2eme possibilité
	InformationsBase ib("ib reference");
	Recept2 r2(ib);
	r2.hello();

	return 0;
}

Mais plus que tout bien se demander si ça vaut la peine de se prendre le chou pour éviter une copie d'objet

Filtered HTML

Plain text

CAPTCHA
Cette question permet de vérifier que vous n'êtes pas un robot spammeur :-)
 M   M  Y   Y  TTTTTT  Y   Y   QQQ   
MM MM Y Y TT Y Y Q Q
M M M Y TT Y Q Q
M M Y TT Y Q QQ
M M Y TT Y QQQQ
Q