L'initialisation d'une référence à un membre de la valeur NULL en C++
Est-il possible d'initialiser un membre de référence à NULL en c++?
J'essaie à quelque chose comme ceci:
class BigClass
{
private:
Object m_inner;
public:
const Object& ReadOnly;
BigClass() : ReadOnly(NULL)
{
Do stuff.
}
};
Je sais que je peux le faire si j'initialise "ReadOnly" à une véritable référence d'un objet, mais quand je veux mettre dedans "NULL", j'obtiens l'erreur:
"impossible de convertir de 'int' à 'const Objet &"
Comment puis-je résoudre ce problème?
- Le point de référence est de rendre cela impossible. L'utilisation régulière d'un pointeur à la place.
- Vous pouvez le faire { const Objet& ReadOnly = *(Objet*)NULL; } Mais sa moche. Le pré-processeur enlève juste le & et le *
- pré-processeur enlève juste le & et le *" non-sens
- hem... permettez-moi de préciser hater. Le préprocesseur annule *& combo. Le déclarant à l'aide de réf & est juste en deçà de la main de sorte que vous n'avez pas besoin d'utiliser l'option -> il court à la main pour (*la).chose. donc là 😉
- Le préprocesseur C++ n'a pas une telle chose.
- Désolé pré-compilateur
Vous devez vous connecter pour publier un commentaire.
Pas, les références ne peuvent pas être
NULL
en C++.1Solutions possibles incluent:
Object
instance qui peut être utilisé pour indiquer "sans objet".[1] à Partir de la C++11:
Vous ne pouvez pas "résoudre" ce. Utiliser un pointeur si vous voulez être en mesure d'avoir ce membre pas pour rien.
Référence doit être initialisée à un objet réel, ils ne peuvent pas "point de nulle part".
Il peut être fait, mais il est presque certainement une très mauvaise idée. La façon de le faire est de déréférencer correctement tapé
NULL
pointeur qui montre déjà que c'est une mauvaise idée: vous arrivez à un comportement non défini à ce stade, qui, cependant, généralement, tend à "travailler".En C++ références sont destinés à se réfèrent toujours à un objet réel. C'est différent pour d'autres langages de programmation où les "références" sont en fait l'équivalent de pointeurs en C++ (généralement sans des choses comme l'arithmétique des pointeurs). Ce que vous avez probablement fait envie (vous n'a malheureusement pas dire ce que vous essayez d'atteindre, mais a demandé une solution à un problème qui est sans doute un élément d'une approche erronée) est d'utiliser un pointeur à la place:
Utiliser un pointeur:-
const Objet* pReadOnly;
Il est utile dans la rédaction de l'unité-tests. C'est le seulement endroit où il doit être fait, mais là, c'est tout à fait utile.
Ici, je suis en train de tester le code qui utilise
MockClass
, pasMockClass
lui-même.Ce n'est pas une panacée, mais il peut aider. Aussi, GoogleMock pourrait être votre ami si vous êtes moqueur "béton" des classes.
RealClass
, et qui appellefoo()
sur queRealClass
. Nous injecter à la fois laRealClass
et laBar
instances.MockClass
doit appeler le constructeur deRealClass
, mais les données sous-jacentes ne sont jamais nécessaires. C'est valable de cas d'utilisation, cessez donc de la baisse de vote.