[C++] Constructeurs et données membres

Résolu
KX Messages postés 16761 Date d'inscription   Statut Modérateur Dernière intervention   -  
KX Messages postés 16761 Date d'inscription   Statut Modérateur Dernière intervention   -
Bonjour,

J'essaye d'utiliser une librairie (que je ne peux pas modifier).
Elle contient en particulier deux classes qui n'ont pas de constructeur par défaut.
Or j'ai besoin d'initialiser des données membres dans mon constructeur, et je n'y arrive pas !

Ceci fonctionnerait dans un autre contexte :

XLSFile xf(nomFichier);
XLSSheet xs = xf.newSheet("stats");

Ce que j'ai essayé pour mon constructeur :

class fichierExcel
{
private:
	XLSFile xf;
	XLSSheet xs;
public:
	fichierExcel(const std::string &nomFichier)
	{
		XLSFile x(nomFichier);
		xf = x;
		xs = xf.newSheet("stats");
	}
};

Je remercie d'avance chacune de vos propositions...

Informations supplémentaires :

Erreurs à la compilation (Visual Studio 2008) :

error C2512: 'XLSSheet' : aucun constructeur par défaut approprié disponible
error C2512: 'xlsFile::XLSFile' : aucun constructeur par défaut approprié disponible

Prototypes des opérations concernés :

XLSFile(const std::string &chem, xlsFile::use_option m = CREATE)

XLSSheet(const std::string &nom, xlslib_core::workbook &w)
XLSSheet(xlslib_core::worksheet *wsh)

XLSSheet xlsFile::XLSFile::newSheet(const std::string &name = "sheet")
A voir également:

3 réponses

ydurce Messages postés 78 Date d'inscription   Statut Membre Dernière intervention   18
 
ou tu déclares des pointeurs et tu crée les variables dans ta fonction fichierexcel.
1
KX Messages postés 16761 Date d'inscription   Statut Modérateur Dernière intervention   3 020
 
Salut !

fichierExcel n'est pas une fonction mais le constructeur de ma classe, et ce ne sont donc pas des variables dont j'ai besoin, mais des données membres, et c'est bien le problème...
0
ydurce Messages postés 78 Date d'inscription   Statut Membre Dernière intervention   18
 
tu déclares des données membres pointeurs sur tes classes xls,
et tu les instancies (new) dans ton constructeur;
0
ydurce Messages postés 78 Date d'inscription   Statut Membre Dernière intervention   18
 
ou si tu y tiens vraiment, tu les déclares avec une valeur de fichier par défaut
XLSFile xf(CString("defaut.xls"));
0
KX Messages postés 16761 Date d'inscription   Statut Modérateur Dernière intervention   3 020
 
J'ai essayé ceci, ça compile, mais à l'exécution ça plante :(

class toto
{
	tata* ta;
	titi* ti;
public:
	toto(int c)
	{			
		ti = new titi(c);
		*ta = ti->foo(34); // Exception non gérée
        }                          // Violation d'accès lors de l'écriture.	
};
0
ydurce Messages postés 78 Date d'inscription   Statut Membre Dernière intervention   18
 
ta n'est pas créé, il faut créer la donnée avant d'essayer de lui affecter une valeur !
0
loupius Messages postés 697 Date d'inscription   Statut Membre Dernière intervention   148
 
Elle contient en particulier deux classes qui n'ont pas de constructeur par défaut
Si, il existe, si nécessité se fait sentir, toujours un constructeur par défaut, c'est-à-dire un constructeur qui n'accepte pas de paramètres. Dans le cas où aucun n'est défini par le programmeur, le compilateur en crée un.
Si tu veux absolument construire un objet et lui passer un nom de fichier, tu as 2 solutions:
- soit tu crées l'objet et ensuite tu appelles une fonction membre qui permet d'enregistrer ce nom de fichier,
-soit tu dérives ta classe et tu construis un objet en passant le nom du fichier; il te faut évidemment définir un constructeur qui accepte ce paramètre et qui appellera le constructeur et la fonction membre de la classe de base.
Bonne continuation.
0
KX Messages postés 16761 Date d'inscription   Statut Modérateur Dernière intervention   3 020
 
Salut !

Il existe peut-être effectivement des constructeurs par défaut, mais le compilateur me dit clairement qu'il ne peut pas les utiliser (aucun constructeur par défaut approprié disponible)

En fait le seul constructeur disponible (défini par le programmeur) prends en paramètre un nom de fichier - et éventuellement une option. Donc je n'ai pas besoin de dériver ma classe ou d'utiliser une fonction membre pour passer mon nom de fichier, cela se fait (et c'est obligatoire) dans la construction de l'objet. J'y arrive très bien avec des variables locales, mais pas avec mes données membres !
0
KX Messages postés 16761 Date d'inscription   Statut Modérateur Dernière intervention   3 020
 
Merci de vos réponses.
Voici un code simple qui génère mon problème :

class tata
{
	int a0,b0;
public:
	tata(int a, int b)
	{
		a0=a;
		b0=b;
	}

	tata(int b)
	{
		a0=0;
		b0=b;
	}
};

class titi
{
	int c0,d0;
public:
	titi(int c,int d=0)
	{
		c0=c;
		d0=d;
	}

	tata foo(int a)
	{
		tata t(a,5);
		return t;
	}
};

class toto
{
	tata ta;
	titi ti;
public:
	toto(int c) // error C2512: 'titi' et 'tata'
	{	    // aucun constructeur par défaut approprié disponible
		titi t(c);
		ti = t;
		ta = t.foo(34);
	}
};

int main() 
{
	titi ti(12);  
	tata ta=ti.foo(23);

	toto to(5);

	return 0; 
}
0