【问题标题】:Overload subscript operator for base's member基成员的重载下标运算符
【发布时间】:2023-03-30 15:19:01
【问题描述】:
#include <iostream>
#include <string.h> // strlen, strcpy

这里我们有一个带有非默认 ctor、名称的 getter 及其析构函数的 Base 类。

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){}
};

我的问题是如何使 main 中的最后一行代码正常工作?

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

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

【问题讨论】:

  • 你好像忘记了字符串的真正名称是null终止字节字符串。 strlen 不计算空终止符。为什么不让自己轻松一点并使用std::string?
  • 至于您的问题,您可以通过例如d1.name()[0],或reading more about operator overloading。也许你应该 find a good beginners book 这应该解释一切。
  • Operator overloading的可能重复
  • @Someprogrammerdude 是的,我忘记了最后的空字符。这是我的教授设置的测验。他只是希望它是那样的。

标签: c++ overloading operator-keyword subscript


【解决方案1】:

我的问题是如何使 main 中的最后一行代码正常工作?

只需加括号即可调用getter

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

但总的来说,这不是一个好主意。你可以在你的基类public 中创建char 数组,或者甚至更好地使用std::string。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-02-05
    • 1970-01-01
    • 1970-01-01
    • 2014-04-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多