基础成员的重载下标操作符

问题描述:

#include <iostream> 
#include <string.h> // strlen, strcpy 

这里我们有一个非默认ctor的基类,一个名字和它的析构函数的getter。基础成员的重载下标操作符

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_; 
    } 
}; 

派生类继承自Base,并有其自己的非默认ctor。

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

我的问题是如何让主要代码的最后一行工作?

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

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

您似乎忘记了字符串的真实名称是*** null终止***字节字符串。 'strlen'不计算空终止符。你为什么不简化自己并使用'std :: string'? –

+0

至于你的问题,你可以通过做例如'd1.name()[0]',或[阅读更多关于运算符重载](http://en.cppreference.com/w/cpp/language/operators)。也许你应该[找到一个好的初学者书](http://*.com/questions/388242/the-definitive-c-book-guide-and-list)应该解释一切。 –

+0

[运算符重载]可能的重复(https://*.com/questions/4421706/operator-overloading) –

我的问题是我怎么做的主代码的最后一行的工作?

只需加括号来调用吸气

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

但总的来说,这是一个不太好主意。您可以在基类public中制作char阵列,或者甚至更好地使用std::string