Maison > développement back-end > C++ > Erreur de compilation C++ : les membres statiques ne peuvent pas être initialisés par des expressions constantes, comment la résoudre ?

Erreur de compilation C++ : les membres statiques ne peuvent pas être initialisés par des expressions constantes, comment la résoudre ?

王林
Libérer: 2023-08-22 08:13:10
original
1576 Les gens l'ont consulté

En programmation C++, les membres statiques sont des propriétés publiques d'une classe. Ils sont accessibles sans s'appuyer sur un objet spécifique, car son cycle de vie est le même que celui de la classe, avec une seule copie. Mais lorsque vous utilisez des membres statiques, vous rencontrerez parfois une erreur de compilation indiquant que les membres statiques ne peuvent pas être initialisés par des expressions constantes. Alors, comment cette erreur se produit-elle et comment la résoudre ? Cet article le présentera sous deux aspects.

1. Raisons pour lesquelles les membres statiques ne peuvent pas être initialisés par des expressions constantes

Dans la norme C++11, le concept d'expression constante constexpr est introduit, qui fait référence à une expression dont le résultat peut être calculé au moment de la compilation. Les constantes peuvent être définies en utilisant constexpr, par exemple :

constexpr int max(int a, int b) {
    return a > b ? a : b;
}
Copier après la connexion

Lors de l'utilisation de cette fonction, le compilateur peut calculer le résultat au moment de la compilation, donc max(1, 2) peut être considéré comme une expression constante. Son résultat est 2. Mais lors de l'utilisation de membres statiques, si vous essayez d'utiliser une expression constante pour initialiser les variables membres statiques, une erreur de compilation se produira. Par exemple :

class MyClass {
public:
    static constexpr int m_value = 10; // 编译错误
};
Copier après la connexion

Cela est dû au fait que l'ordre d'initialisation des membres statiques est lié à l'ordre d'évaluation des expressions constantes. En C++, les membres statiques sont initialisés dans l'ordre de déclaration et les expressions constantes sont évaluées au moment de la compilation. Ainsi, si un membre statique dépend d'une expression constante, il doit être garanti qu'il sera initialisé après l'expression constante.

2. Méthodes pour résoudre le problème selon lequel les membres statiques ne peuvent pas être initialisés par des expressions constantes

Il existe trois méthodes pour résoudre ce problème, à savoir :

1. Utiliser des expressions constantes entières pour initialiser des membres statiques

Une expression constante entière est. a Une expression constante spéciale qui implique uniquement des littéraux entiers, des opérateurs arithmétiques et des fonctions ou membres sans effets secondaires. Pour les variables membres statiques, vous pouvez utiliser des expressions constantes entières pour initialiser, par exemple :

class MyClass {
public:
    static const int m_value = 10; // 正确
};
Copier après la connexion

Pour d'autres types de variables membres statiques, vous pouvez également utiliser cette méthode, assurez-vous simplement d'utiliser des expressions constantes entières pour l'initialisation.

2. Utiliser des variables en ligne

Dans la norme C++17, le concept de variables en ligne est introduit, ce qui permet de définir des variables dans les fichiers d'en-tête sans provoquer de problèmes de définition multiples. Pour les variables membres statiques, vous pouvez utiliser des variables en ligne pour initialiser, par exemple :

class MyClass {
public:
    inline static int m_value = 10; // 正确
};
Copier après la connexion

L'utilisation de variables en ligne peut éviter le problème selon lequel les membres statiques ne peuvent pas être initialisés par des expressions constantes. C'est également plus pratique et ne nécessite pas de définir les variables séparément dans. le fichier source.

3. Utiliser l'initialisation retardée

L'initialisation paresseuse signifie l'initialisation lorsque des variables de membre statiques doivent être utilisées. Cette méthode peut éviter le problème selon lequel les membres statiques ne peuvent pas être initialisés par des expressions constantes, par exemple :

class MyClass {
public:
    static int& m_value() {
        static int s_value = 10;
        return s_value;
    }
};
Copier après la connexion

via une fonction membre statique. une référence, puis son initialisation lorsque vous devez utiliser des variables de membre statiques peut éviter le problème selon lequel les membres statiques ne peuvent pas être initialisés par des expressions constantes. L'avantage de cette approche est que vous pouvez contrôler de manière flexible le timing d'initialisation des variables membres statiques selon vos besoins, tout en évitant une initialisation inutile au démarrage du programme.

Résumé

Les membres statiques sont des propriétés publiques d'une classe, accessibles sans s'appuyer sur un objet spécifique. Cependant, lors de l'utilisation de membres statiques, vous rencontrerez parfois une erreur de compilation indiquant que les membres statiques ne peuvent pas être initialisés par des expressions constantes. La raison de ce problème est que l'ordre d'initialisation des membres statiques est lié à l'ordre d'évaluation des expressions constantes. Afin de résoudre ce problème, vous pouvez utiliser des expressions constantes entières pour initialiser les membres statiques, utiliser des variables en ligne pour initialiser les membres statiques ou utiliser une initialisation paresseuse pour éviter le problème selon lequel les membres statiques ne peuvent pas être initialisés par des expressions constantes. La méthode à choisir dépend de la situation spécifique et doit être choisie de manière flexible en fonction des besoins réels.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal