2010-06-15 4 views
-1

J'ai reçu des devoirs à faire connaître le programme sans jeter à l'aide des constructeurs c'est donc mon code, j'ai deux classes:erreur dans C++, dans le contexte

class Base { 
protected: 
    int var; 
public: 
    Base(int var = 0); 
    Base(const Base&); 
    Base& operator=(const Base&); 
    virtual ~Base(){}; 
    virtual void foo(); 
    void foo() const; 
    operator int(); 
}; 

class Derived: public Base { 
public: 
    Derived(int var): Base(var){}; 
    Derived(const Base&); 
    Derived& Derived::operator=(const Base& base); 
    ~Derived(){}; 
    virtual void foo(); 
}; 

ici deux de mes fonctions dérivées:

Derived::Derived(const Base& base){ 
    if (this != &base){ 
     var=base.var; 
    } 
} 

Derived& Derived::operator=(const Base& base){ 
    if (this != &base){ 
     var=base.var; 
    } 
    return *this; 
} 

mais j'ai une erreur within context quand j'appelle ces lignes

Base base(5); 
Base *pderived = new Derived(base); //this row works perfectly 
Derived derived = *pderived; // I think the problem is here 

Merci pour toute aide

+6

"Dans le contexte" est seulement * partie * du message d'erreur. Il doit y avoir des éléments au-dessus de cette ligne pour vous indiquer l'erreur réelle et les éléments sous cette ligne vous indiquant le contexte (c'est-à-dire, le numéro de ligne et le nom de la fonction). –

+0

Savez-vous que 'Derived derived = * pderived;' appelle le constructeur 'Derived :: Derived (const Base & base)'? –

+0

Est-ce par hasard lié à [type non-scalaire demandé] (http://stackoverflow.com/questions/3046463/non-scalar-type-requested/3046537#3046537)? – Troubadour

Répondre

0

Vous ne pouvez accéder aux membres protégés d'une autre objet si cet objet est du même type que l'objet qui essaie d'y accéder. Dans votre exemple, le constructeur et l'opérateur d'affectation prennent tous les deux un const Base& donc il n'y a aucune garantie que l'objet réel sera de type Derived.

0

Il y a une erreur (VS2010)

error C2248: 'Base::var' : cannot access protected member declared in class 'Base'

à la ligne

var=base.var;

+0

À droite, car 'base' pourrait avoir le type' class Other: public Base {}; '. 'Derived' n'est pas dans la chaîne d'héritage pour' Other', donc il n'a pas accès aux membres protégés. –

0

Derived doit déléguer la copie de Base membres à Base::operator=, au lieu d'essayer de mettre ses petites mains crasseuses sur les membres protégés d'un autre objet.

Questions connexes