2010-07-02 4 views
8

J'essaye de bloquer l'accès au constructeur par défaut d'une classe que j'écris. Le constructeur que je veux que les autres utilisent nécessite une référence const à un autre objet. J'ai rendu le constructeur par défaut privé pour empêcher d'autres de l'utiliser. J'obtiens une erreur de compilation pour le constructeur par défaut car la variable membre de la référence const n'est pas initialisée correctement. Que puis-je faire pour faire cette compilation?La référence const doit être initialisée dans la liste d'initialisation constructeur/base

class CFoo 
{ 
public: 
    CFoo(); 
    ~CFoo(); 
}; 

class CBar 
{ 
public: 
    CBar(const CFoo& foo) : fooReference(foo) 
    { 
    } 

    ~CBar(); 

private: 
    const CFoo& fooReference; 

    CBar() // I am getting a compiler error because I don't know what to do with fooReference here... 
    { 
    } 
}; 

Répondre

12

ne déclarez pas le constructeur par défaut. Il n'est de toute façon pas disponible (automatiquement) si vous déclarez votre propre constructeur.

class CBar 
{ 
public: 
    CBar(const CFoo& foo) : fooReference(foo) 
    { 
    } 
private: 
    const CFoo& fooReference; 
}; 

explication assez complète des constructeurs se trouve ici: http://www.parashift.com/c++-faq-lite/ctors.html

+1

Merci pour votre aide. Pour une raison quelconque, je pensais que le compilateur a généré un constructeur par défaut même si je n'en ai pas écrit un. –

+2

@Trevor Oui, à condition de ne pas déclarer explicitement un constructeur (quel qu'il soit) dans votre définition de classe. –

+2

@Trevor Vous devrez peut-être également bloquer le constructeur de copie. – rwong

4

La meilleure façon de créer le constructeur par défaut que vous ne l'utilisez pas wanna (c'est le cas avec votre constructeur, est-ce pas?) est tout simplement pas le définir, c'est:

class CBar 
{ 
public: 
    CBar(const CFoo& foo) : fooReference(foo) 
    { 
    } 

    ~CBar(); 

private: 
    const CFoo& fooReference; 

    CBar(); 
}; 

Dans ce cas, il peut être un peu superflu, car le compilateur ne crée pas un constructeur par défaut pour une classe avec un élément de référence, mais il vaut mieux pour le mettre au cas où vous supprimez le membre de référence.

Questions connexes