【问题标题】:how to properly overload operator cast char* in C++?如何在 C++ 中正确重载运算符 cast char*?
【发布时间】:2024-05-01 05:35:02
【问题描述】:

我有一个带有数值的类。 我需要添加一个运算符重载,当强制转换为 char*(或 wchar*)时,它会返回一个具有可读值的字符串。

我试过了

VAR::operator char*()
{
  STRING test;
  test.format("%d",value); //fills string with "readable" data
  return test.Get() //returns the char* content of the test;
}

但是调用 STRING 的析构函数会删除该值并返回随机数据。

有什么想法吗?

【问题讨论】:

  • 这是 C++。我们在这里只说std::stringish。 char * 太 C 了。
  • 我需要它来修改一个框架,我不能使用std::string。
  • 顺便说一句,如果它在 std::string 的位置,问题将持续存在。
  • 如果你不能改变返回类型,使用一个缓冲区成员,在那里复制格式化字符串并返回一个指向缓冲区的指针,或者,如果你是脏类型,使用全局静态缓冲区并做同样的事情。
  • 隐式转换是危险的,所以我首先要重新考虑转换运算符的整个想法。它真的有必要吗,还是显式转换是前进的方向?

标签: c++ string operator-overloading return-value


【解决方案1】:

有什么想法吗?

  1. 使用字符串而不是字符指针。

    VAR::运算符 STRING();

  2. 如果不是 1. 则返回一个新的字符串副本。

char const *retVal = new char[test.size() + 1]; std::strncpy(retVal, test.Get(), test.size()); retVal[test.size()] = '\0'; return retVal;.

(以后别忘了delete[]。)

  1. 最后,您可以将test 设为您的班级成员并返回其内容;那么它将在函数结束后继续存在。

【讨论】:

    【解决方案2】:

    除非你要求调用者在返回的指针上调用delete[],否则你不能这样做。

    VAR::operator char*()
    {
      char* test = new char[required_bytes];
      // Fill 'test'
      return test;
    }
    

    只返回一个std::string(或std::wstring)对象会更好、更明智。当调用者想要一个C字符串时,他们可以调用w/stringc_str()方法。

    【讨论】:

      最近更新 更多