Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Exception dans le constructeur d'une classe de base

5 réponses
Avatar
Greg
Bonjour,

J'ai un petit souci pour r=E9cup=E9rer une exception lanc=E9e dans le
constructeur d'une classe de base (cette classe doit g=E9rer une
connection =E0 une base de donn=E9es, et je souhaite qu'il n'y en ait qu'une
pour toute l'application). Cette classe est d=E9clar=E9e comme une base
virtuelle de plusieurs autres, qui servent =E0 leur tour de base pour une
classe qui donne acc=E8s =E0 la totalit=E9 de leurs m=E9thodes. Hop, un pet=
it
coup d'ASCII pour fixer tout =E7a :

SQL
^
/|\
/ | \
A B C
^ ^ ^
\ | /
\|/
D


Afin de v=E9rifier le nombre d'instances de la classe SQL produites, j'ai
un compteur d=E9clar=E9 static dans celle ci, que v=E9rifie son constructeu=
r,
et si ce compteur d=E9passe 1, une exception est lanc=E9e.

Le probl=E8me c'est que je n'arrive pas =E0 r=E9cup=E9rer cette exception a=
vec
ce code (en admettant que la classe E soit d=E9clar=E9e avec "public SQL" et
non "virtual public SQL") :

try
{
D* d =3D new D(arg1);
E* e =3D new E(arg2);
// code
}
catch(std::logic_error& e)
{
// dump de l'erreur et sortie
}

Comment faire pour choper cette salet=E9 d'exception, histoire que l'appli
quitte en explicant un peu quelle est la cause de l'erreur ?

D'avance merci,
Greg

5 réponses

Avatar
Christophe de VIENNE
Cette classe est déclarée comme une base
virtuelle de plusieurs autres, qui servent à leur tour de base pour une
classe qui donne accès à la totalité de leurs méthodes. Hop, un petit
coup d'ASCII pour fixer tout ça :

SQL
^
/|
/ |
A B C
^ ^ ^
| /
|/
D


Afin de vérifier le nombre d'instances de la classe SQL produites, j'ai
un compteur déclaré static dans celle ci, que vérifie son constructeur,
et si ce compteur dépasse 1, une exception est lancée.

Le problème c'est que je n'arrive pas à récupérer cette exception avec
ce code (en admettant que la classe E soit déclarée avec "public SQL" et
non "virtual public SQL") :


Ça devrait fonctionner pourtant. Qu'est-ce qui se passe exactement ?

Est-ce qu'il n'y a pas une clause throw() sur un des constructeurs
impliqués dans la construction d'un E ?


--
Christophe de Vienne

Avatar
Jean-Marc Bourguet
Greg writes:

J'ai un petit souci pour récupérer une exception lancée dans le
constructeur d'une classe de base
[...]


Peux-tu donner un exemple complet montrant le probleme? Parce que
avec ta description je ne vois pas de probleme (a part un risque de
fuite de memoire en cas d'exception mais ce n'est pas de ca dont tu
parlais).

A+

--
Jean-Marc
FAQ de fclc++: http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ
C++ FAQ Lite en VF: http://www.ifrance.com/jlecomte/c++/c++-faq-lite/index.html
Site de usenet-fr: http://www.usenet-fr.news.eu.org

Avatar
Falk Tannhäuser
Bonjour,
je n'arrive pas à reproduire le problème décrit avec le petit programme
ci-dessous. Essaye de poster un bout de code capable de montrer ce que
ne va pas...
Le fait que 'SQL' soit une classe de base virtuelle ou non de 'E' ne doit
rien changer dans le comportement.
______________________________________________________________________________
#include <iostream>
#include <ostream>
#include <stdexcept>
#include <cstddef>
#include <memory>

struct SQL
{
static unsigned cnt;
SQL() { if(++cnt > 1) throw std::logic_error("Too many SQL instances"); }
};

unsigned SQL::cnt = 0;

struct A : public virtual SQL {};
struct B : public virtual SQL {};
struct C : public virtual SQL {};

struct D: public A, public B, public C {};
struct E: public /* virtual */ SQL {};

int main()
{
try
{
std::cout << __LINE__ << ": Creating a 'D' ..." << std::endl; // Line 26
std::auto_ptr<D> d(new D);
std::cout << __LINE__ << ": OK. Creating an 'E' ... " << std::endl; // Line 28
std::auto_ptr<E> e(new E);
std::cout << __LINE__ << ": OK." << std::endl; // Line 30
// code
}
catch(std::logic_error& ex)
{ // dump de l'erreur et sortie
std::cerr << "Logic error '" << ex.what() << "' occured!n";
return EXIT_FAILURE;
}
return EXIT_SUCCESS;
}
______________________________________________________________________________

26: Creating a 'D' ...
28: OK. Creating an 'E' ...
Logic error 'Too many SQL instances' occured!

--
Falk
Avatar
Greg
're,

Finalement mes doutes sont levés, je suis un boulay. Après la rapide
écriture d'un programme en un seul fichier qui reprend ma hiérarchie en
très simplifié, sa compil et la constatation du bon fonctionnement de la
chose, j'ai recompilé tout mon code *après* un 'make clean'. Et ça
fonctionne. Le pourquoi de la chose me dépasse complètement par contre.
Bon, je file me cacher dans un trou microscopique.

Mille excuses pour le dérangement inutile,
Greg
Avatar
Fabien LE LEZ
On Tue, 17 Aug 2004 17:47:07 +0200, Greg :

je suis un boulay


C'est dingue, Loft Story a même changé l'orthographe !


--
;-)