我做了一个 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/