1

'lut,


j'ai un problème de dépendance circulaire :

voici l'arborescence des inclusions :

PQ_Statement.cpp
   PQ_Statement.h
      SQL_Exception.h
      Statement.h
         SQL_Exception.h                         // pas inclus car protégé (tout le fichier est parcouru)
         Connection.h
            SQL_Exception.h                      // pas inclus car protégé (tout le fichier est parcouru)
            Statement.h                           // pas inclus car protégé (en train d'être parcouru)
            PreparedStatement.h
               Statement.h                        // pas inclus car protégé (en train d'être parcouru)


et là, c'est le drame, vu que PreparedStatement dérive de Statement... (à la déclaration de PreparedStatement, il a besoin de connaitre Statement...)
Comment procédez vous pour résoudre ce genre de problèmes ??

2

ben c'est clair que tu peux pas avoir PreparedStatement qui a besoin de Statement qui a besoin de Connection qui a besoin de PreparedStatement... soit tu peux trouver une sous-partie de Connection (par exemple) qui suffit à Statement, ce qui fait que Statement aurait juste besoin de ConnectionCore et pas de PreparedStatement, soit tu dois te débrouiller avec des classes incomplètes [en déclarant "class Connection;" au lieu d'inclure Connection.h]), mais ça peut demander pas mal de modifications au code ^^

« The biggest civil liberty of all is not to be killed by a terrorist. » (Geoff Hoon, ministre des transports anglais)

3

oué, bref, c'est lourd à gérer, quoi sad
En java y'a même pas besoin de se poser la question.. C'est quand même plus pratique smile

Surtout que je peux m'arranger pour que ça fonctionne pour PQ_Statement.cpp, mais après ça fait des effets de bords pour d'autres classes.. couic

Enfin bref, merci, je vais voir ça.

4

Pollux (./2) :
ce qui fait que Statement aurait juste besoin de ConnectionCore et pas de PreparedStatement


clairement Statement n'a pas besoin de PreparedStatement, mais comment tu gères ça ? (proprement ?)

5

./3>
ben en C++ c'est plus compliqué parce que tu peux passer des objets par valeur comme par référence, et si tu veux faire du passage par valeur le compilo est obligé d'avoir bcp plus d'infos...

mais si tu te limites au cas java (passage par référence, pas de fonctions inline) c'est très facile :
Connection.h :
#ifndef CONNECTION_H_
#define CONNECTION_H_

class Connection;

#include "PreparedStatement.h"

class Connection {
  ...
};
#endif

« The biggest civil liberty of all is not to be killed by a terrorist. » (Geoff Hoon, ministre des transports anglais)

6

Pen^2 (./4) :
Pollux (./2) :
ce qui fait que Statement aurait juste besoin de ConnectionCore et pas de PreparedStatement


clairement Statement n'a pas besoin de PreparedStatement, mais comment tu gères ça ? (proprement ?)

ben si Connection a besoin de PreparedStatement, je vois mal comment Statement pourrait ne pas en avoir besoin ?

« The biggest civil liberty of all is not to be killed by a terrorist. » (Geoff Hoon, ministre des transports anglais)

7

ben Connection a besoin de Statement et PreparedStatement :

	class Connection
	{
	public:
		//[...]

		virtual Statement* createStatement( void ) const
			throw ( SQLException ) = 0 ;

		virtual PreparedStatement* prepareStatement( const string& sql ) const
			throw ( SQLException ) = 0 ;
	} ;




mais Statement n'a pas besoin de PreparedStatement
	class PreparedStatement : public Statement
	{
	public:
		//[...]
		virtual void setBytes( int parameterIndex, const unsigned char* tab ) = 0 ; // oué je sais qu'il manque la taille de tab, mais c'est pas le pb %)
	} ;


	class Statement
	{
	public:
		//[...]
		virtual void close() throw ( SQLException ) = 0 ;
		virtual const Connection* getConnection() const throw ( SQLException ) = 0 ;
		virtual ResultSet* executeQuery( const string& sql ) throw ( SQLException ) = 0 ;
		virtual const int executeUpdate( const string& sql ) throw ( SQLException ) = 0 ;
	} ;

8

Pollux (./5) :
ben en C c'est plus compliqué parce que tu peux passer des objets par valeur comme par référence, et si tu veux faire du passage par valeur le compilo est obligé d'avoir bcp plus d'infos...


oui j'ai bien compris qu'il a besoin de la taille de l'objet pour le passage par valeur, mais à force de vouloir permettre des trucs exotiques (passage d'objets par valeurs), ça devient vraiment le boxon à gérer... (faut dire que je suis mauvais en c++, mais bon, quand même...)

9

(tiens, je ne savais pas qu'on pouvait passer un objet par valeur en C++ [je n'ai jamais fait de C objet] ; c'est pas le sujet, mais quand on voit la complexité de certains objets, je trouve ça un peu dangereux au niveau mémoire, non ?)
avatar

10

si, c'est n'imp. Après, c'est à l'user de savoir ce qu'il fait...










Bon, sinon :
Ça compile avec cygwin, mais sous Visual C++ 6, ça déconne toujours complètement.... rage mad vtff bang
ex :

Sous Visual C++ 6 SP6 :
--------------------Configuration: BDDManager - Win32 Debug--------------------
Compiling...
PQ_Connection.cpp
c:\3dsmax6\maxsdk\samples\bddmanager\pq_connection.h(33) : error C2143: syntax error : missing ',' before '&'
c:\3dsmax6\maxsdk\samples\bddmanager\pq_connection.h(33) : error C2059: syntax error : '&'
c:\3dsmax6\maxsdk\samples\bddmanager\statement.h(34) : error C2143: syntax error : missing ',' before '&'
c:\3dsmax6\maxsdk\samples\bddmanager\statement.h(34) : error C2059: syntax error : '&'
c:\3dsmax6\maxsdk\samples\bddmanager\statement.h(35) : error C2143: syntax error : missing ',' before '&'
c:\3dsmax6\maxsdk\samples\bddmanager\statement.h(35) : error C2059: syntax error : '&'
c:\3dsmax6\maxsdk\samples\bddmanager\pq_connection.cpp(76) : error C2511: 'prepareStatement' : overloaded member function 'class SQLManager::PreparedStatement *(const class std::basic_string<char,struct std::char_traits<char>,class std::allocator<ch
ar> > &) const' not found in 'SQLManager::PQ_Connection'
        c:\3dsmax6\maxsdk\samples\bddmanager\pq_connection.h(19) : see declaration of 'PQ_Connection'
Error executing cl.exe.

PQ_Connection.obj - 7 error(s), 0 warning(s)



Sous Cygwin :
/cygdrive/c/3dsmax6/maxsdk/samples/BDDManager
$ g++ --version
g++ (GCC) 3.3.3 (cygwin special)
Copyright (C) 2003 Free Software Foundation, Inc.
Ce logiciel est libre; voir les sources pour les conditions de copie.  Il n'y a PAS
GARANTIE; ni implicite pour le MARCHANDAGE ou pour un BUT PARTICULIER.

/cygdrive/c/3dsmax6/maxsdk/samples/BDDManager
$ g++ -Wall -c PQ_Connection.cpp 

/cygdrive/c/3dsmax6/maxsdk/samples/BDDManager

11

mad mad mad mad mad mad mad mad mad mad mad mad mad mad mad mad mad mad mad mad mad mad mad mad mad

12

bon, sur ce, bonne soirée...

13

Ton problème est un problème de conception, plus que de langages.

14

Pen^2 (./10) :
--------------------Configuration: BDDManager - Win32 Debug--------------------
Compiling...
PQ_Connection.cpp
c:\3dsmax6\maxsdk\samples\bddmanager\pq_connection.h(33) : error C2143: syntax error : missing ',' before '&'
c:\3dsmax6\maxsdk\samples\bddmanager\pq_connection.h(33) : error C2059: syntax error : '&'

tu as bien mis des déclarations de classes incomplètes ? ("class Toto;")
Pen^2 (./10) :
MARCHANDAGE

lolpaf

Nil (./9) :
(tiens, je ne savais pas qu'on pouvait passer un objet par valeur en C++ [je n'ai jamais fait de C objet] ; c'est pas le sujet, mais quand on voit la complexité de certains objets, je trouve ça un peu dangereux au niveau mémoire, non ?)

ben quand tu passes une chaîne à une fonction, tu la passes par valeur (sauf si tu précises spécifiquement std::string&), idem pour plein de trucs de la STL... c'est dangereux seulement si tu as de l'héritage, mais normalement dans ces cas-là le constructeur de copie doit être marqué comme inaccessible et donc tu ne peux pas passer par valeur ^^

« The biggest civil liberty of all is not to be killed by a terrorist. » (Geoff Hoon, ministre des transports anglais)

15

PpHd (./13) :
Ton problème est un problème de conception, plus que de langages.

Tu crois ? En fait, il s'agit plus ou moins d'une adaptation d'un code Java que j'ai déjà réalisé. Du coup, pour faire ma classe de connexion à la base de données, je ne me suis pas posé de question, j'ai pris le parti de suivre délibérément l'API Java (http://java.sun.com/j2se/1.5.0/docs/api/java/sql/package-summary.html).

16

Pollux (./14) :
Pen^2 (./10) :
--------------------Configuration: BDDManager - Win32 Debug--------------------
Compiling...
PQ_Connection.cpp
c:\3dsmax6\maxsdk\samples\bddmanager\pq_connection.h(33) : error C2143: syntax error : missing ',' before '&'
c:\3dsmax6\maxsdk\samples\bddmanager\pq_connection.h(33) : error C2059: syntax error : '&'

tu as bien mis des déclarations de classes incomplètes ? ("class Toto;")

Oui, oui (enfin sauf erreur). Tiens par contre de mémoire, ça me parait étrange qu'il y ait encore des références...
Enfin, là je n'ai pas le code sous la main pour vérifier, je regarderai ça demain matin.
Pollux (./14) :
Pen^2 (./10) :
MARCHANDAGE

lolpaf

lol, je n'avais même pas fait attention. Ça sent à peine la traduction à l'arrache grin

17

y'a quelqu'un qui a VC+ .NET pour tester si ça compile mieux que sous VC++6 ?

18

Pen^2 (./16) :
Oui, oui (enfin sauf erreur). Tiens par contre de mémoire, ça me parait étrange qu'il y ait encore des références... Enfin, là je n'ai pas le code sous la main pour vérifier, je regarderai ça demain matin.


en fait, non, c'est normal : voici la ligne en question :
PreparedStatement* prepareStatement( const string& sql ) const throw ( SQLException ) ;

19

si c'est '&' qui pose pb c'est peut-être que t'as pas déclaré string ? trigic

« The biggest civil liberty of all is not to be killed by a terrorist. » (Geoff Hoon, ministre des transports anglais)

20

ba, si tongue. Enfin ça a un peu évolué, là.
Je n'ai plus qu'un problème pour un module.

21

rhrhhrhahahahhahahahhhhhhhhhhhhhhhaaaaaaaaaaaaaaaaaaaaa !!!


Est ce que quelqu'un saurait me dire pourquoi le comportement est différent selon que __WORKAROUND__ est défini ou pas ? trifus
(avec __WORKAROUND__ ça compile, sans, c'est l'erreur qui suit le code)


#if !defined(AFX_DRIVERMANAGER_H__1B88321E_CFE9_42B3_9178_C3A4FEACA729__INCLUDED_)
#define AFX_DRIVERMANAGER_H__1B88321E_CFE9_42B3_9178_C3A4FEACA729__INCLUDED_

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000



#include <string>

//#define __WORKAROUND__

namespace SQLManager
{
#ifndef __WORKAROUND__
	using namespace std ;
#endif
	class Connection ;


	class DriverManager
	{
	public:
		virtual ~DriverManager() ;

#ifndef __WORKAROUND__
		virtual Connection* getConnection( const string& url, const string& user, const string& password ) const = 0 ;
#else
		virtual Connection* getConnection( const std::string& url, const std::string& user, const std::string& password ) const = 0 ;
#endif
	} ;

}

#endif // !defined(AFX_DRIVERMANAGER_H__1B88321E_CFE9_42B3_9178_C3A4FEACA729__INCLUDED_)




Résultat de la compilation quand __WORKAROUND__ n'est pas défini :

PQ_DriverManager.cpp
c:\3dsmax6\maxsdk\samples\bddmanager\drivermanager.h(30) : error C2143: syntax error : missing ',' before '&'
c:\3dsmax6\maxsdk\samples\bddmanager\drivermanager.h(30) : error C2059: syntax error : '&'



La ligne 30 est celle là :

virtual Connection* getConnection( const string& url, const string& user, const string& password ) const = 0 ;

22

Je sais que Visual 6 a quelques bugs justement au niveau des using namespace.
Donc, je conseillerais d'utiliser systématiquement le workaround, même si c'est plus long à écrire.

(là où ça gène plus, c'est quand on tente d'utiliser des opérateurs, mais ça, c'est de l'implémentation, ça se fait donc dans le .cpp... Ou dans le .h pour des templates sick )
avatar
Maintenant j'ai la flemme de garder une signature à jour sur ce site. Je n'ai même plus ma chaîne Exec sous la main.

23

Qu'est-ce que t'appelle bug de Visual 6 ? Il n'arrive pas à compiler un truc qui devrait ?
Ce serait pas du à des divergences au niveau d'une norme C++?
(d'ailleurs, y'en a-t-il plusieurs seulement en C++, comme pour le C ?)

oui, je sais, j'suis un nioub du c++ tongue

24

Il y a une norme en C++, mais Visual 6 date d'avant.
Et oui, je parle bien d'un bug du compilateur, pas de l'EDI.
avatar
Maintenant j'ai la flemme de garder une signature à jour sur ce site. Je n'ai même plus ma chaîne Exec sous la main.

25

./15: Oué j'en suis sûr.

26

Link (./22) :
Je sais que Visual 6 a quelques bugs justement au niveau des using namespace.
Donc, je conseillerais d'utiliser systématiquement le workaround, même si c'est plus long à écrire.

(là où ça gène plus, c'est quand on tente d'utiliser des opérateurs, mais ça, c'est de l'implémentation, ça se fait donc dans le .cpp... Ou dans le .h pour des templates sick )


ok merci (j'ai tenté avec un using std::string; et ça fonctionne maintenant... (d'ailleurs plus récemment j'ai regardé pour remettre un using namespace std;, et ça refonctionne... 'fin bref, j'ai laissé using std::stringwink)

PpHd (./25) :
./15: Oué j'en suis sûr.

Ben je ne vois pas ce qu'il y a de fantastique... Quelques accesseurs et on se retrouve dans le même cas que moi... Enfin j'avais peut être mal expliqué mon problème.

27

./26: une mauvaise conception n'est jamais fantastique.

28

certes tongue