Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#26 Le 05/11/2008, à 21:53

rniamo

Re : C++ et exceptions [Résolu]

pour résumer : le passage par référence via un throw est un passage par valeur ?


< Quelques un des mes programmes  | Cuisine Facile (pour les gourmands) | Fast MVC for PHP >
        \   ^__^
         \  (o o)\_______
            (___)\            )\

Hors ligne

#27 Le 05/11/2008, à 22:13

tiky

Re : C++ et exceptions [Résolu]

Tu le passes pas par référence avec le throw...

Object obj;
throw obj;

C'est dans le catch que tu as le choix entre faire une copie de la copie ou prendre une référence sur la copie.


Conseil d'expert: il vous faut un dentifrice adapté...

Hors ligne

#28 Le 05/11/2008, à 22:14

rniamo

Re : C++ et exceptions [Résolu]

oui mais (désolé je tarde) si je le prend par référence, tu m'as dit q'une copie était créé, non ?


< Quelques un des mes programmes  | Cuisine Facile (pour les gourmands) | Fast MVC for PHP >
        \   ^__^
         \  (o o)\_______
            (___)\            )\

Hors ligne

#29 Le 05/11/2008, à 22:40

tiky

Re : C++ et exceptions [Résolu]

Une copie est toujours créée quoi qu'il arrive car la fonction d'où provient l'exception a disparu de la pile d'exécution et donc l'objet exception d'origine aussi. C'est ensuite que tu peux soit demander une copie de la copie ou une référence sur cette copie pour bénéficier du polymorphisme. Désolé je peux pas faire mieux, pour moi c'est très clair.

Je crois que j'ai compris ce que tu comprends pas. Il n'y a qu'une seule copie qui est effectuée pour tout les catchs et cela quelque soit le nombre de catchs. Si dans un catch du demande un passage par valeur, alors le compilateur effectue une copie de la copie.

Dernière modification par tiky (Le 05/11/2008, à 22:50)


Conseil d'expert: il vous faut un dentifrice adapté...

Hors ligne

#30 Le 05/11/2008, à 23:00

rniamo

Re : C++ et exceptions [Résolu]

je viens d'écrire :

#include <iostream>
#include <cstdlib>
#include <string>
#include <sstream>

class Exception {
	private:
		std::string err;
	public:
		Exception(std::string str) : err(str) {
		}
		
		Exception() : err("") {
		}
		
		Exception(const Exception& e) {
			this->err=e.err;
		}
		
		const std::string what() {
			return err;
		}
		
		void set(const std::string& str) {
			err=str;
		}
};

void f() {
	std::ostringstream s;
	Exception e;
	
	s << "@ex(f)=" << (&e);
	e.set(s.str());
	
	Exception *ae=&e;
	
	throw e;
}

int main() {
	try {
		f();
	}
	catch(Exception& e) {
		std::ostringstream s;	
		s << "@ex(catch)=" << (&e);
		std::cout << s.str() << '\n';
		std::cout << e.what() << std::endl;
	}
	
	return EXIT_SUCCESS;
}

et j'ai bien 2 adresses distinctes (au passage un Exception *e=&...; static_cast<int>(e); me donne une erreur, je ne peut pas caster une adresse en int ?

Ton dernier post m'éclaircit tout et j'étais en train de comprendre : les exceptions (objets) sont enregistré puis en fonction de ce qu'on demande le mécanismes de passage apr paramètres est mis en jeu.

edit : le static_cast devait plutôt être un reinterpret_cast. Merci beaucoup pour votre patience et vos précisions.

Dernière modification par rniamo (Le 05/11/2008, à 23:02)


< Quelques un des mes programmes  | Cuisine Facile (pour les gourmands) | Fast MVC for PHP >
        \   ^__^
         \  (o o)\_______
            (___)\            )\

Hors ligne

#31 Le 05/11/2008, à 23:03

tiky

Re : C++ et exceptions [Résolu]

#include <iostream>
#include <exception>

class A
{
    public:
	void foo( void );
};

void A::foo( void )
{
    int e=0;
    std::cout << "Object e: " << &e << std::endl;
    throw e;
}

void foobar( void )
{
    try
    {
	A obj;
	obj.foo();
    }
    catch( int & copy1 )
    {
	std::cout << "Object copy1: " << &copy1 << std::endl;
	throw;
    }
}

int main( void )
{
    try
    {
	foobar();
    }
    catch( int & copy2 )
    {
	std::cout << "Object copy2: " << &copy2 << std::endl;
    }

    return 0;
}

Comme tu peux le constater, le passage par référence n'engendre aucune copie. Par contre tu peux retirer le & dans le premier ou le second catch et tu obtiendras une seconde copie. Autre détail intéressant, si tu relances l'exception avec throw sans argument, c'est la copie d'origine qui est retransmise et cela même si tu as demandé un passage par valeur dans le catch où tu la relances. Évidemment si tu donnes un argument au throw, il lancera l'exception donnée wink

#include <iostream>
#include <exception>

class A
{
    public:
	void foo( void );
};

void A::foo( void )
{
    int e=0;
    std::cout << "Object e: " << &e << std::endl;
    throw e;
}

void foobar( void )
{
    try
    {
	A obj;
	obj.foo();
    }
    catch( int & copy1 )
    {
	std::cout << "Object copy1: " << &copy1 << std::endl;
	throw;
    }
}

void foobarbar( void )
{
    try
    {
	foobar();
    }
    catch( int copy2 )
    {
	std::cout << "Object copy2: " << &copy2 << std::endl;
	throw;
    }
}

int main( void )
{
    try
    {
	foobarbar();
    }
    catch( int & copy3 )
    {
	std::cout << "Object copy3: " << &copy3 << std::endl;
    }

    return 0;
}

Dernière modification par tiky (Le 05/11/2008, à 23:21)


Conseil d'expert: il vous faut un dentifrice adapté...

Hors ligne

#32 Le 06/11/2008, à 09:29

rniamo

Re : C++ et exceptions [Résolu]

Superbe, merci


< Quelques un des mes programmes  | Cuisine Facile (pour les gourmands) | Fast MVC for PHP >
        \   ^__^
         \  (o o)\_______
            (___)\            )\

Hors ligne

#33 Le 06/11/2008, à 10:41

tiky

Re : C++ et exceptions [Résolu]

J'ajoute que si tu fais un throw qui relance une nouvelle exception dans un catch, de la même manière que dans une fonction, l'objet exception n'est locale qu'au catch, le compilateur crée une copie qui vient écraser la copie faite de la première exception. Le compilateur ne peut gérer qu'une seule exception à la fois.

Dernière modification par tiky (Le 06/11/2008, à 10:41)


Conseil d'expert: il vous faut un dentifrice adapté...

Hors ligne