C++ 基'的重载下标运算符;s成员

C++ 基'的重载下标运算符;s成员,c++,overloading,operator-keyword,subscript,C++,Overloading,Operator Keyword,Subscript,派生类公开继承自基类,并具有自己的非默认构造函数 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_; } };

派生类公开继承自基类,并具有自己的非默认构造函数

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_;
  }
};
我的问题是如何使main中的最后一行代码正常工作

class Derived : public Base {
public:
  Derived(const char* str)
    : Base(str){}
};
intmain()
{
字符d1name[]{“d1”};
衍生d1(d1name);
标准::cout
我的问题是如何使main中的最后一行代码正常工作

class Derived : public Base {
public:
  Derived(const char* str)
    : Base(str){}
};
只需添加括号即可调用getter

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

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

但总的来说,这不是一个好主意。您可以在基类
中公开
char
数组,或者更好地使用
std::string

您似乎忘记了字符串的真实名称是以空结尾的字节字符串。空终止符不被
strlen
计算。为什么不呢难道你不想让自己变得简单并使用
std::string
?至于你的问题,你可以通过执行例如
d1.name()[0]
,或者。也许你应该解释一下。可能是@Someprogrammerdude的重复。对了,我忘了结尾的空字符。这是我的教授设置的测验。他只是想这样。
    d1.name()[0] = 'D';
        // ^^