将Date转换为const char*
Converting Date to const char*
我做了一个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;
,因为用于将日期转换为字符串的数组由该类的所有实例共享。
- 在字符串函数中抛出'char const*'实例后调用的终止
- 双重标准?为什么只有 char* const&a = "bla" 的警告?
- 包括"lvtocon.h",未定义对'operator<<(std::ostream&, char const*)的引用
- 为什么 const char* const & = 可以编译"hello"?
- 将字符串文本常量定义为 char const* 和 wchar const*
- 如何将std::wstring转换为char const[]
- "char const * name() const _WEBSOCKETPP_NOEXCEPT_TOKEN_ {"剂量是什么意思
- 使用提升对字符串进行标记化时,将令牌转换为 char* const* 时失败
- 如何从 std::initializer_list<char const* 构建 std::vector<std::string>>
- 将 std::vector<std::string> 转换为 const char* const*
- 引发"char const*"错误的实例后调用的终止
- 将const char * const参数成员分配给新值
- 从'const char**'到'char* const*'的转换无效
- 从 sub_match<常量字符 *>' 转换为'const char *const &'
- char*const和constchar*之间有什么区别?(重复-需要更多澄清)
- 使用工厂方法时编译器错误:无法转换"const std::p air<char* const
- HEVC 解码器端口 Android 警告:从 'signed char*' 到 'char const* 的转换无效*
- 如何从'char const*'中删除常量
- 'char const *str'作为模板参数
- 为什么不;t strlen(.)应为const char*const str,而不是const char*