我必须编写一个函数(c ++),其定义是:
const char* getFileName(const char* name);
简而言之,这个函数将取名,检查一些条件并附加一个后缀,使其成为一个正确的文件名。例如:
此函数返回的name =“someFile”,return =“someFile-hd.png”
const char*
将立即传递给另一个,其中const char*
作为参数
something->loadFile(getFileName("someFile"));
我遇到的问题是,当我在我的函数中创建const char*
时,它的范围将限制在它创建的函数中。另一方面,我无法修改{的代码{1}}函数,因为它是我正在使用的第三方库。
我可以在loadFile
周围写一个包装来删除我创建的loadFile
,但我不想这样做,因为这是一个移植练习,这会打破一些模板我'已经创建,以使其更容易。
有没有办法像我描述的那样编写这个函数?
由于
编辑: 小解释:
const char*
是我想写的函数,我可以更改返回类型,但它必须作为getFileName
函数的参数。我的主要问题是loadFile
返回的const char*
要么丢失,要么因为超出范围而丢失,要么我必须明确删除它,这会破坏我的移植模板。我想在一个函数调用中生成文件名而不对它做任何其他事情[换句话说,在原始代码中我有getFileName
我希望将其更改为loadFile("something.png")
而不添加任何新行这一点。
答案 0 :(得分:5)
如果您可以将getFileName()
的返回类型更改为std::string
,则可以执行以下操作:
std::string getFileName(const char* a_name)
{
std::string result(a_name);
result += ".png";
return result;
}
// No memory management req'd
something->loadFile(getFileName("someFile").c_str());
答案 1 :(得分:2)
使用const
参数的主要逻辑是,它意味着你不会在接受它的函数体中改变这个参数。
如果您想更改它,请不要使用const
。
不要担心将char*
投射到const char*
。有隐含的转换。
尽管如此,您并不需要更改此const char*
参数。您可以使用它来构造std::string
对象并避免可能的内存泄漏 - 通过hmjd检查答案。
答案 2 :(得分:1)
从函数中返回指针通常在C中没有意义(在C ++中甚至更少)。 既然你用C和C ++标记了这个,这就是C答案。
执行此操作的常用方法如下:
void getFileName (const char* name,
char* complete_name,
size_t complete_name_n)
{
... // create a new file name in a temp buffer
if(the new file name has a strlen() < complete_name_n)
{
strcpy(complete_name, the new file name);
}
}
// caller:
char name_buf [N];
getFileName(name, name_buf, N);
something->LoadFile(name_buf);
例如,整个Windows API以这种方式完全调用函数,将参数分配给调用者,让函数仅关注其任务(而不是内存分配等)。
当然,这意味着调用者必须键入多行而不是一行。此时你应该问问自己最重要的是什么: