c++ - 将日期转换为 const char*

标签 c++ casting type-conversion

我做了一个 Date 类,我正在尝试创建一个转换方法,这样你就可以将一个 Date 对象转换为一个 const char* “字符串”。它必须是 const char*不是 string

但是,我发现了一些我无法解决的问题。

这是我的方法:

Date::operator char*() const {
    tm date = { 0, 0, 0, day_, month_ - 1, year_ - 1900, 0, 0, -1 };
    mktime(&date);

    char* weekday[] = { "sunday", ..., "saturday" };
    char* month[] = { "january", ..., "diciembre" };

    char string[50];
    sprintf(string, "%s %d / %s / %d", weekday[fch.tm_wday], day_, month[fch.tm_mon], year_);

    return string;
}

编译器说:

warning: address of local variable ‘cadena’ returned [-Wreturn-local-addr]
  char string[50];

如果我为字符串变量添加 static 标签,它将被共享,我不希望这样。

我该怎么做?

最佳答案

在类级别定义您的缓冲区,并在写入后从您的方法中返回它。

但请记住,这是一种愚蠢的工作方式,因为 (1) 对该方法的后续调用将改变缓冲区,如果他们仍然保留该指针,则会影响之前的调用者,以及 (2) 因为它违反了单一职责原则- 最后一次格式化操作的细节在逻辑上根本不属于日期类的状态。此外,缓冲区必须标记为 mutable 才能从您的 const 方法进行修改,这是一个明显的迹象,表明您违反了类的预期职责。

或者,“经典 C”方法将更改方法以从调用者接收缓冲区(及其大小),然后只写入其中。这将内存管理的负担转移到调用者身上(它在逻辑上属于它),但使使用该方法的语法变得相当沉重。

这两种方法在功能上都很笨拙和/或次优;我什至不会提到返回指向动态分配内存的指针的可能性,因为它具有与 std::string 相同的开销,但没有自动内存管理(所以它绝对是最愚蠢的选择).

如前所述,正确的 C++ 方法是返回一个 std::string,它自己处理分配内存的生命周期。除非你处于极其特殊的条件下,否则没有理由不使用它。

关于c++ - 将日期转换为 const char*,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22668885/

相关文章:

c++ - 如何将 CComVariant bstr 转换为 CString

c++ - 在编译时为 C++ 中的成员函数添加别名

java - 教科书中的类型转换问题——它是 0.05 还是 0.5?

c++ - 将 Boost FileSystem3 迭代器转换为 const char*

c# - 将 C 转换为 C#

c++ - C/C++类型转换将int **转换为const int **

C++:默认参数和 vector

python - 并行 Python-C++ 程序卡住(内存?)

c++ - 什么样的数据类型将在 C++ 中保存 3000000^2?

java - 将 Java int[][] 的神秘 bytea 表示形式转换回数组(Hibernate)