2017-03-24 2 views
0

Je suis très nouveau dans C++. J'ai une situation comme: J'ai une classe de base qui contient deux fonctions virtuelles (NOT PURE). J'ai une classe dérivée pour cette classe où j'ai implémenté ces fonctions virtuelles. Maintenant, dans ma fonction main(), j'ai créé un pointeur vers l'objet pointeur vers la classe de base. Maintenant, en utilisant cet objet, comment puis-je accéder à l'objet et aux fonctions de la classe dérivée? Je veux seulement que le pointeur sur l'objet pointeur de la classe de base soit utilisé pour accéder à l'objet de la classe dérivée.Affectation et accès à l'objet de classe dérivée à l'objet "pointeur vers pointeur" de la classe de base en C++

classe de base:

class another 
{ 
    public: 
    virtual void setName(){}; 
    virtual string getName(){}; 
}; 

classe dérivée

class use: public another 
{ 
    public: 
     string str; 
    void setName() 
     { 
      str = "USE CLASS"; 
     } 
     string getName() 
     { 
      return str; 
     } 
}; 

MY fonction main():

int main() 
{ 
    another **an; 
    *an = new use(); 
    an->setName(); //getting error 
    cout<<an->getName()<<endl; //getting error 
    return 0; 

} 

Répondre

2
*an = new use(); 

pointeur an n'est pas initialisé, il ne peut pas être déréférencé. L'utilisation du pointeur double (pointeur vers le pointeur) n'a pas de sens pratique ici. Tout ce que tit fait est d'ajouter un autre niveau de référence au code dans ce cas. Expression qui déréférence un tel pointeur, résulte en valeur du pointeur vers la classe 'autre', stocké ... où? Vous n'avez jamais créé ce stockage, donc une telle opération est un UB.

variantes juridiques de code:

int main() 
{ 
    another **an = new another*(); // creating storage for pointer 
    *an = new use(); 
    (*an)->setName(); 
    cout<<(*an)->getName()<<endl; 
    delete *an; // don't rely on OS to do so. 
    delete an; 
    return 0; 
} 


int main() 
{ 
    another **an = new another*(new use()); // doing this in one line 
    // storage of *an would be value-initialized by value returned 
    // from 'new use()' instead of default initialization 
    (*an)->setName(); 
    cout<<(*an)->getName()<<endl; 
    delete *an; // don't rely on OS to do so. 
    delete an; 
    return 0; 
} 

int main() 
{ 
    another *an = new use(); 
    // We don't need another pointer~ use an reference where required? 

    an->setName(); 
    cout<<an->getName()<<endl; 
    delete an; // don't rely on OS to do so. 
    return 0; 
} 

PS. Cette déclaration de classe another est techniquement mal formée, je peux supposer que vous aviez ignoré le corps de getName. Cela devrait provoquer une erreur de compilation à propos de la valeur de retour manquante de la fonction. Si another est classe inutilisable lui-même, vous pouvez déclarer des méthodes comme pur

class another 
{ 
    public: 
    virtual void setName() = 0; 
    virtual string getName() = 0; 
}; 

Une instance de cette classe ou d'une classe dérivée qui ne remplace pas ces méthodes ne peut pas être créé, mais il prévoit que la mécanique « boilerplate » vous » re étudier.

+0

Excellent. Merci mon pote –

0

an est un pointeur vers le pointeur vers another. *an renvoie un pointeur sur another. Donc, vous voulez (*an)->setName(); comme ceci:

int main() 
{ 
    another **an; 
    *an = new use(); 
    (*an)->setName(); //getting error 
    cout<<(*an)->getName()<<endl; //getting error 
    return 0; 
} 
+0

merci compagnon. Mais quand j'utilise la même fonction main() que celle que vous avez fournie ci-dessus, j'obtiens une erreur comme la variable non initialisée 'an' utilisée. Pouvez-vous me dire comment l'initialiser? –