将Date转换为const char*

Converting Date to const char*

本文关键字:char const Date 转换      更新时间:2023-10-16

我做了一个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)因为它违反了单一职责原则——最后一次格式化操作的细节在逻辑上根本不属于date类的状态。此外,缓冲区必须被标记为mutable,以便从const方法修改,这是一个明显的迹象,表明您违反了您的类的预期职责。

在另一种情况下,"经典C"方法将改变方法,从调用者那里接收一个缓冲区(以及它的大小),并在其中写入。这将内存管理的负担转移到调用者身上(它在逻辑上属于这里),但使使用该方法的语法变得相当繁重。

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

在其他地方已经说过,正确的c++方法是返回一个std::string,它自己处理分配的内存的生命周期。除非你在极端特殊的情况下,没有理由不使用它。

您在函数内部创建了一个名为string的变量,一旦函数返回,它将超出范围(即成为无效的引用)。你还返回了一个指向它的指针,这意味着你引用了一个不再有效的内存区域。

考虑返回一个std::string,它为您自动管理内存。

EDIT:如果不这样做,你总是可以有一个static数组并返回一个指向它的指针。

Date::operator const char*() const
{
    static char str[50];
    // fill in array
    return str;
}

当然,您现在不能做以下操作:

Date d1{...};
Date d2{...};
const char* d1_str = s1;
const char* d2_str = s2;

,因为用于将日期转换为字符串的数组由该类的所有实例共享。