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

New avec struct ?

10 réponses
Avatar
No_Name
Bonjour,

Une question que je me pose :

Dans un programme en C++, puis-je utiliser une sctructure (définie par
struct) avec new/delete, ou faut-il impérativement passer par
malloc/free ?

Merci.

10 réponses

Avatar
Jean-Marc Bourguet
No_Name writes:

Dans un programme en C++, puis-je utiliser une sctructure (définie par
struct) avec new/delete,



Oui. Definir une classe avec struct n'est pas tres different que de la
definir avec class. Si je ne m'abuse pas, la seule difference, c'est
l'accessibilite par defaut (private pour class, public pour struct).

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
No_Name
Jean-Marc Bourguet avait prétendu :
No_Name writes:

Dans un programme en C++, puis-je utiliser une sctructure (définie par
struct) avec new/delete,



Oui. Definir une classe avec struct n'est pas tres different que de la
definir avec class. Si je ne m'abuse pas, la seule difference, c'est
l'accessibilite par defaut (private pour class, public pour struct).

A+



Merci.
Avatar
pjb
No_Name writes:

Bonjour,

Une question que je me pose :

Dans un programme en C++, puis-je utiliser une sctructure (définie par
struct) avec new/delete, ou faut-il impérativement passer par
malloc/free ?



En C++, il n'y a pas de différence fondamentale entre class et struct.
(PCQJS, la différence porte seulement sur la visibilité par défaut des membres).

Les deux déclarations suivantes sont équivalentes :

struct Example {
int counter;
Example(int c):counter(c){};
};

class Example {
public:
int counter;
Example(int c):counter(c){};
};

on peut bien sur faire:

Example* e=new Example(42);
std::cout<<(e->counter)<<std::endl;
delete e;

dans les deux cas.

--
__Pascal Bourguignon__
Avatar
James Kanze
On Mar 12, 11:19 am, No_Name wrote:

Une question que je me pose :



Dans un programme en C++, puis-je utiliser une sctructure
(définie par struct) avec new/delete, ou faut-il
impérativement passer par malloc/free ?



Comme d'autres ont déjà dit, il n'y a pas vraiment des
« struct » en C++ ; que tu te sers du mot clé struct ou du
mot clé class, tu définis une classe. Mais aussi : les
operateurs new et delete marche pour tout type, sans exception.
Tu peux bien faire « new int », par exemple. En général, il
n'y a pas de raison d'utiliser malloc/free dans du C++ pûr.

--
James Kanze (GABI Software) email:
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34
Avatar
Fabien LE LEZ
On Fri, 13 Mar 2009 01:48:21 -0700 (PDT), James Kanze
:

que tu te sers du mot clé struct ou du
mot clé class, tu définis une classe.



Par convention, j'ai tendance à utiliser "struct" quand il n'y a que
des membres publics. Mais ce n'est effectivement qu'une convention
personnelle, pas un truc du langage lui-même.
Avatar
Alexandre BACQUART
Fabien LE LEZ wrote:
On Fri, 13 Mar 2009 01:48:21 -0700 (PDT), James Kanze
:

que tu te sers du mot clé struct ou du
mot clé class, tu définis une classe.



Par convention, j'ai tendance à utiliser "struct" quand il n'y a que
des membres publics. Mais ce n'est effectivement qu'une convention
personnelle, pas un truc du langage lui-même.



C'est amusant finalement ce petit détail de C++ : deux mots clés pour
faire sensiblement la même chose (alors qu'en revanche, certains mots
clé ont plusieurs usages, comme 'static'). En fait, j'ai toujours été
curieux des raisons pour lesquelles 'class' a été introduit, alors que
rien ne semble le justifier dans la mécanique du langage duquel C++
hérite déjà. Ce n'est quand-même pas simplement pour introduire une
bonne habitude consistant à protéger tous les membres par défaut ? Cela
m'interpelle...

Typiquement, à la longue, j'ai pris l'habitude de n'utiliser struct que
pour des structures bas-niveau, comme une façon d'auto-documenter qu'il
s'agit plutôt d'un agrégat. Je l'utilise également souvent pour les
functors.


--
Alex
Avatar
James Kanze
On Mar 13, 6:53 pm, Fabien LE LEZ wrote:
On Fri, 13 Mar 2009 01:48:21 -0700 (PDT), James Kanze
:



>que tu te sers du mot clé struct ou du
>mot clé class, tu définis une classe.



Par convention, j'ai tendance à utiliser "struct" quand il n'y
a que des membres publics. Mais ce n'est effectivement qu'une
convention personnelle, pas un truc du langage lui-même.



Tout à fait. Des variants de cette règle d'écriture sont assez
répandus -- chez moi, par exemple, j'utilise struct quand les
membres données sont public, class autrement (et je ne suis pas
toujours cohérent quand il n'y a pas de membres données, que des
fonctions ou des typedef publiques). Mais c'est toujours une
règle d'écriture, non une règle du langage.

Note aussi que selon la norme, le mot clé union définit aussi
une classe. Mais à l'encontre de struct et de class, c'est une
classe bien différente des autres.

--
James Kanze (GABI Software) email:
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34
Avatar
Fabien LE LEZ
On Fri, 13 Mar 2009 22:52:17 +0100, Alexandre BACQUART
:

Ce n'est quand-même pas simplement pour introduire une
bonne habitude consistant à protéger tous les membres par défaut ?



Il est fort possible que ce soit une des raisons. N'oublie pas qu'au
départ, le C++ s'adressait à des programmeurs C.

Peut-être aussi que "class" sonnait plus "OO".
Avatar
Fabien LE LEZ
On Sat, 14 Mar 2009 02:29:22 -0700 (PDT), James Kanze
:

Note aussi que selon la norme, le mot clé union définit aussi
une classe.



Yep. J'ai tendance à tout le temps l'oublier, celui-là. Je ne suis pas
sûr de l'avoir déjà utilisé.
Avatar
James Kanze
On Mar 14, 2:04 pm, Fabien LE LEZ wrote:
On Sat, 14 Mar 2009 02:29:22 -0700 (PDT), James Kanze
:



>Note aussi que selon la norme, le mot clé union définit aussi
>une classe.



Yep. J'ai tendance à tout le temps l'oublier, celui-là. Je ne
suis pas sûr de l'avoir déjà utilisé.



C'est vrai qu'elles servent beaucoup moins en C++ qu'en C. Mais
j'ai toujours :
union MaximumAlignment
{
long l ;
long long ll ;
double d ;
long double ld ;
char* pc ;
MaximumAlignment* ps ;
void (* pf)() ;
} ;
avec ici et là, des :

union
{
unsigned char buffer[ sizeof( T ) ];
MaximumAlignment dummyForAlignment ;
} ;

Et parfois quand je me sers de lex/flex.

--
James Kanze (GABI Software) email:
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34