Je voulais savoir les differences entre ces différentes définitions et initialisations de variables :
int a(1);
int b = 2;
int c{3;
De plus, j'ai voulu créer un objet de la classe CircleShape de SFML dans une classe que j'ai créée. J'ai voulu placer l'argument dans le header (histoire de tester des choses) et lorsque je donne cet argument entre ()
sf::CircleShape m_cercle(10);
J'obtiens une erreure du compilateur :
error: expected identifier before numeric constant
error: expected ',' or '...' before numeric constant
En revanche, si je donne l'argument entre {}, je n'ai plus d'erreurs et le programme compile bien
sf::CircleShape m_cercle{10};
Ma question étant donc de savoir pourquoi il renvoit une erreur avec les () mais pas avec les {} ?
Sinon ton erreur vient du fait qu'on ne peut pas initialiser une donnée membre avec les () au moment de la déclaration, ce n'est pas autorisé.
class X
{
private:
sf::CircleShape m_cercle(10); // Error !
sf::CircleShape m_cercle{10}; // Ok !
sf::CircleShape m_cercle = sf::CircleShape(10); // Ok !
sf::CircleShape m_cercle = sf::CircleShape{10}; // Ok !
};
En fait, si ce n'est pas autorisé, c'est pour empêcher une ambiguïté entre une donnée membre et une fonction. Prenons un exemple, on a une classe Foo toute bête et une classe Bar qui prend en argument un objet de type Foo au moment de sa construction :
class Foo{};
class Bar
{
public:
Bar(const Foo& f); // Ctor
};
Maintenant, imaginons que les parenthèses soient autorisées pour initialiser une donnée membre. On crée une classe A qui contient une donnée de type Bar qu'on souhaite initialiser au moment de sa déclaration :
class A
{
private:
Bar b(Foo()); // Ambiguïté ! (b est une donnée membre ou une fonction ?)
};
Donc voilà pourquoi il n'est pas autorisé d'initialiser une donnée membre avec des parenthèses. Les parenthèses sont réservées pour la déclaration de fonction ;).
Merci pour cette réponse qui répond parfaitement à ma question. En effet, je n'avais pas pensé qu'on pouvait confondre un attribut avec la déclaration d'une méthode en mettant des parenthèses. À vrai dire, je ne savais même pas qu'il était possible d'initialiser un attribut dans le header d'une classe (j'initialise tous les attributs dans le(s) constructeur(s)).
Merci encore pour cette réponse claire et precise.
Définitions et initialisations de variables
× Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
× Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
...