Renvoyer un tableau de structure

Résolu
freepouy18 Messages postés 49 Date d'inscription mercredi 20 avril 2005 Statut Membre Dernière intervention 15 septembre 2005 - 8 août 2005 à 12:04
freepouy18 Messages postés 49 Date d'inscription mercredi 20 avril 2005 Statut Membre Dernière intervention 15 septembre 2005 - 9 août 2005 à 15:30
Bonjour tlm,


J'ai un petit souci avec une methode de classe qui doit retourner un tableau de structure. Voila ce que je veux faire :



MaClasse.h
//*****************************
class CMaClasse
{
public :


struct Test
{
CString name;
CString tab_notes[50];
};


struct Test *Set();
}
//*****************************



MaClasse.cpp
//*****************************
struct Test *CMaClasse ::Set()
{
Test *Mastructure;

//traitement
........
........


return Mastructure;
}
//*****************************


Mais j'ai toujours 2 erreurs :


error C2556: 'struct Test *__thiscall CMaClasse::Set()' : overloaded function differs only by return type from 'struct CMaClasse::Test *__thiscall CPSAWordMod1::Set()') :


error C2371: 'Set' : redefinition; different basic types

Le code de la methodes est bon mais c'est vraiment au niveau des déclarations que j'ai un soucis.
Merci pour votre aide, bonne journée....

18 réponses

xterminhate Messages postés 371 Date d'inscription dimanche 4 janvier 2004 Statut Membre Dernière intervention 23 septembre 2009
8 août 2005 à 21:06
Bonsoir Steeve. Je crains que tu ais fait qq erreurs aussi. "typename"
est inutile car il n'y a aucune ambiguité. Tu as oublié un * dans la
définition (je pense que le lecteur aura corrigé de lui même, c'est
just eun oubli).



En outre, j'ai donné la solution au probleme au début et ca passe sous GCC. Je la redonne de manière plus explicite :



.h:

class CMaClass

{

public:

struct Test {};

Test * Set();

};



.cpp :

CMaClass::Test * CMaClass::Set(){}


Freep : aligne nous deux lignes de code C++ correct et on en reparle, alors ecoute.



Cordialement,
Xterminhate.
3
xterminhate Messages postés 371 Date d'inscription dimanche 4 janvier 2004 Statut Membre Dernière intervention 23 septembre 2009
8 août 2005 à 13:04
Enleve struct.

Cordialement,
Xterminhate.
0
xterminhate Messages postés 371 Date d'inscription dimanche 4 janvier 2004 Statut Membre Dernière intervention 23 septembre 2009
8 août 2005 à 13:10
Tu t'obstines à faire des fonctions du genre: X * f(). Ca me parait assez dangereux si nu maitrises pas bien les pointeurs.

Cordialement,
Xterminhate.
0
freepouy18 Messages postés 49 Date d'inscription mercredi 20 avril 2005 Statut Membre Dernière intervention 15 septembre 2005
8 août 2005 à 14:13
J'ai essayé d'enlever struct mais ça ne fonctionne pas nonplus!!!
erreurs :
error C2143: syntax error : missing ';' before '*'
error C2501: 'Test' : missing storage-class or type specifiers
error C2501: 'Set' : missing storage-class or type specifiers

en ce qui concerne les pointeurs que me proposes-tu comme autre solution alors (dans ce cas précis biensur)?
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
xterminhate Messages postés 371 Date d'inscription dimanche 4 janvier 2004 Statut Membre Dernière intervention 23 septembre 2009
8 août 2005 à 14:32
De ne pas en utiliser pour te simplifier la vie : std::vector te permet de faire des tableaux sans te préocuper de l'allocation, de la libération et de tous les problemes de copie/affectation.

.h -> Test * Set();
.cpp -> CMaClasse::Test * CMaClasse::Set()...
0
magic_Nono Messages postés 1878 Date d'inscription jeudi 16 octobre 2003 Statut Membre Dernière intervention 16 mars 2011
8 août 2005 à 14:34
c'est de l'acharnement ma parole, ya po moyen de rester sur un seul post??

imaginez un peu celui qui a un pb et cherche une soluce, il va tomber
sur tt ceux ci et du coup ne trouvera rien de concrêt que des ptts
bouts d'infos de ci dela



qd ça reste sur le mm sujet, ne changez pas de post !
0
luhtor Messages postés 2023 Date d'inscription mardi 24 septembre 2002 Statut Membre Dernière intervention 28 juillet 2008 6
8 août 2005 à 14:34
En plus de ce qu'il t'a dit,



essaies de mettre

typedef struct Test

{

...

};


++
0
magic_Nono Messages postés 1878 Date d'inscription jeudi 16 octobre 2003 Statut Membre Dernière intervention 16 mars 2011
8 août 2005 à 14:44
luthor>

typedef struct T

{

..

}T2;

avec T optionnel, mais T2 n'est pas optionnel


___________________________________________________________
Magicalement
Nono
0
freepouy18 Messages postés 49 Date d'inscription mercredi 20 avril 2005 Statut Membre Dernière intervention 15 septembre 2005
8 août 2005 à 15:15
j'avais déja essayé ça magic_Nono...
0
xterminhate Messages postés 371 Date d'inscription dimanche 4 janvier 2004 Statut Membre Dernière intervention 23 septembre 2009
8 août 2005 à 16:07
La meilleure solution en l'occurence serait que freep se plonge dans un bon livre de C/C++ pour réviser un peu la syntaxe... désolé :-)

Test n'a pas besoin d'être déclarée dans ta classe (encapsulée) pour ce que tu en fais au passage.

Nono va devoir utiliser sa baguette magique. Planquez vous s'il s'enerve ! ;-)
0
magic_Nono Messages postés 1878 Date d'inscription jeudi 16 octobre 2003 Statut Membre Dernière intervention 16 mars 2011
8 août 2005 à 16:12
à ben ici, C'est BruNews qui a une baguette magique....
et parfois il s'énerve (comme ça arrive a tt le monde)



[auteurdetail.aspx?ID=213313 xterminhate] > totally ok pr ce conseil à [auteurdetail.aspx?ID=495098 freepouy18]


___________________________________________________________
Magicalement
Nono
0
freepouy18 Messages postés 49 Date d'inscription mercredi 20 avril 2005 Statut Membre Dernière intervention 15 septembre 2005
8 août 2005 à 16:23
Si vous etes si fort que ça, résolvez mon problème au lieu de critiquer les pers qui sont là pour apprendre sinon abstenez vous ça vaudra mieux. Ok vs avez essayez de m'aider j'ai suivi vos conseils, ça ne marche pas, alors je pense que vous devez aussi réviser
0
steve_clamage Messages postés 475 Date d'inscription dimanche 3 octobre 2004 Statut Membre Dernière intervention 11 août 2006 5
8 août 2005 à 19:36
A croire que personne ne sait lire un message d'erreur !



class CMaClasse
{
public :
struct Test
{
CString name;
CString tab_notes[50];
};



Test *Set();
}



typename CMaClasse::Test CMaClasse ::Set()
{
Test *Mastructure;

//traitement
........
........


return Mastructure;
}





struct == class en C++, à peu de chose près...
0
steve_clamage Messages postés 475 Date d'inscription dimanche 3 octobre 2004 Statut Membre Dernière intervention 11 août 2006 5
8 août 2005 à 21:16
Merci, désolé pour le typename, je suis dans du code template et c'est comme un automatisme
0
freepouy18 Messages postés 49 Date d'inscription mercredi 20 avril 2005 Statut Membre Dernière intervention 15 septembre 2005
9 août 2005 à 09:49
Ecoute xterminhate pour ce qui est des deux lignes de code dont tu parles, figure toi que c'est exactement la première solution que j'ai testé avant même d'ecrire ce post. Les erreurs étaient bien là alors que c'etait la solution la plus logique et surtout la plus juste. Le fait est que lorsque j'ai pris ton exemple, le test a fonctionné mais le plus etonnant c'est qu'avec le même code placé à un endroit différent, à savoir avec la structure avant le constructeur de classe et la définition de la méthode après, ça ne passe pas.


Je ne suis pas sûre que tu savais que ce genre d'erreurs était dû à une histoire de placement de code et à rien d'autre. Alors quand je te dis que je suis les conseils qui me sont donnés et que ça ne fonctionne pas, je ne le fais pas par plaisir.


A bon entendeur salut.
0
xterminhate Messages postés 371 Date d'inscription dimanche 4 janvier 2004 Statut Membre Dernière intervention 23 septembre 2009
9 août 2005 à 11:24
Ce n'est pas tres clair... Par exemple, si je place la déclaration de struct avant celle du contructeur, et si je place la définition de la fonction membre apres celle du contructeur et bien ca compile tout aussi bien.

struct CMaClass
{
struct Test {}; // déclaration avant constructeur de la classe
CMaClass();
Test * Set();
};

CMaClass::CMaClass() {};
CMaClass::Test * CMaClass::Set(){ return 0; } // definition apres

L'ordre d'apparition des déclaration doit être logique. L'ordre d'apparition des définitions n'a pas d'importance. Ainsi, le seul cas vraiment foireux - que j'imagine - est le suivant :

Test * Set(); // utilisation d'un type non encore déclaré.
struct Test {};

Donne nous ton code complet si tu veux être aidé de manière efficace et si le probleme persiste.

Cordialement,
X.
0
steve_clamage Messages postés 475 Date d'inscription dimanche 3 octobre 2004 Statut Membre Dernière intervention 11 août 2006 5
9 août 2005 à 11:54
On peut aussi définir le type CMaClass::Test en dehors de la déclaration de CMaClass.



struct CMaClass

{

struct Test;

Test * Set();

};



struct CMaClass::Test

{

};
0
freepouy18 Messages postés 49 Date d'inscription mercredi 20 avril 2005 Statut Membre Dernière intervention 15 septembre 2005
9 août 2005 à 15:30
xterminhate : c'est bon, c'était juste pour te dire que ta solution proposée est celle que j'avais essayé avant de poster mon pb et que c'est la bonne. Je n'ai plus de problème avec ça. Maintenant, pourquoi cette histoire ne fonctionne pas chez moi, MYSTERE.
L'essentiel est que mon pb est résolu et je vous en remercie.
0
Rejoignez-nous