2017-06-25 5 views
0
#include <iostream> 
#include <string.h> // strlen, strcpy 

Ici, nous avons la classe Base avec un ctor non-par défaut, un getter pour le nom et son destructeur. La classe dérivée hérite publiquement de Base et possède son propre ctor non-par défaut.Opérateur d'indice de surcharge pour le membre de base

class Derived : public Base { 
public: 
    Derived(const char* str) 
    : Base(str){} 
}; 

Ma question est de savoir comment faire pour que la dernière ligne de code dans main fonctionne?

int main() 
{ 
    char d1name[] {"d1"}; 
    Derived d1(d1name); 
    std::cout << d1.name() << std::endl; 

    d1.name[0] = 'D'; 
} 
+1

Vous semblez avoir oublié que le nom réel des chaînes est *** null terminé *** byte strings. Ce terminateur nul n'est pas compté par 'strlen'. Pourquoi ne le faites-vous pas facilement et utilisez 'std :: string'? –

+0

En ce qui concerne votre question, vous la faites fonctionner soit en faisant, par exemple, 'd1.name() [0]', ou en [en savoir plus sur la surcharge de l'opérateur] (http://en.cppreference.com/w/cpp/language/operators). Peut-être que vous devriez [trouver un bon livre pour débutants] (http://stackoverflow.com/questions/388242/the-definitive-c-book-guide-and-list) qui devrait expliquer tout cela. –

+0

Copie possible de [Surcharge de l'opérateur] (https://stackoverflow.com/questions/4421706/operator-overloading) –

Répondre

0

Ma question est de savoir comment puis-je faire la dernière ligne de code principal au travail?

Il suffit d'ajouter des parenthèses pour appeler le getter

d1.name()[0] = 'D'; 
     // ^^ 

Mais en général, qui est un pas si bonne idée. Vous pourriez alors faire le tableau char dans votre classe de base public puis, mieux encore, utiliser un std::string du tout.