2017-06-25 5 views
0

Hier haben wir die Base-Klasse mit einem nicht-Standard-Ctor, ein Getter für Name und Destruktor.Overload-Subscript-Operator für Base-Mitglied

class Base { 
    char *name_; 
public: 
    Base(const char* str) 
    : name_{new char[strlen(str)]} 
    { 
    strcpy(name_,str); 
    } 
    char * name() const 
    { 
    return name_; 
    } 
    virtual ~Base() 
    { 
    delete [] name_; 
    } 
}; 

Die abgeleitete Klasse erbt von der Basis öffentlich und hat ihren eigenen nicht standardmäßigen ctor.

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

Meine Frage ist, wie mache ich die letzte Codezeile in main zu arbeiten?

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

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

Sie scheinen zu vergessen, dass der echte Name von Strings ist *** null terminiert *** Byte-Strings. Dieser Null-Terminator wird nicht von "strlen" gezählt. Warum machst du es dir nicht leicht und benutzt 'std :: string'? –

+0

Wie für Ihre Frage, machen Sie es funktioniert, indem Sie z. 'd1.name() [0]', oder indem [mehr über das Überladen von Operatoren gelesen wird] (http://en.cppreference.com/w/cpp/language/operators). Vielleicht solltest du [ein gutes Anfängerbuch finden] (http://stackoverflow.com/questions/388242/the-definitive-c-book-guide-and-list) welches alles erklären sollte. –

+0

Mögliches Duplikat von [Operatorüberladung] (https://stackoverflow.com/questions/4421706/operator-overloading) –

Antwort

0

Meine Frage ist, wie ich die letzte Zeile des Codes in Haupt machen zu arbeiten?

Gerade Klammer hinzufügen Getter

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

Aber im Allgemeinen zu nennen, die eine nicht so gute Idee. Sie könnten das char Array in Ihrer Basisklasse public dann machen, oder noch besser ein std::string überhaupt verwenden.

Verwandte Themen