Как написать функцию, возвращающую const char *, которая является модифицированным аргументом const char *? - PullRequest
0 голосов
/ 06 февраля 2012

Мне нужно написать функцию (c ++), определение которой:

const char* getFileName(const char* name);

, чтобы сделать ее короткой, эта функция примет имя, проверит некоторые условия и добавит к нему постфикс, сделав егоправильное имя файла.Например:

name = "someFile", return = "someFile-hd.png"

const char*, возвращенный этой функцией, будет немедленно передан другой,который принимает const char* в качестве аргумента

something->loadFile(getFileName("someFile"));

Проблема, с которой я столкнулся, заключается в том, что когда я создаю const char* в своей функции, его область действия будет ограничена функцией, в которой он был создан.С другой стороны, я не могу изменить код функции loadFile, так как я использую стороннюю библиотеку.

Я могу написать обертку вокруг loadFile, чтобы удалить const char*.создан, но я бы не хотел этого делать, поскольку это упражнение по переносу, и это нарушило бы некоторые шаблоны, которые я создал, чтобы упростить его.

Есть ли способ написать эту функцию, как яописано?

Спасибо

РЕДАКТИРОВАТЬ: небольшое объяснение:

getFileName - это функция, которую я пытаюсь написать, я могу изменить тип возвращаемого значения, но он должен соответствоватьв качестве параметра функции loadFile.Моя основная проблема заключается в том, что const char*, возвращаемый getFileName, либо теряется, потому что находится вне области видимости, либо я должен удалить его явно, что нарушает мой шаблон переноса.Я хотел бы сгенерировать имя файла в одном вызове функции и больше ничего не делать [другими словами, в исходном коде у меня есть loadFile("something.png"), и я хочу изменить его на loadFile(getFileName("something")) без добавления каких-либо новых строк после этого.

Ответы [ 3 ]

5 голосов
/ 06 февраля 2012

Если вы можете изменить тип возврата 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());
2 голосов
/ 06 февраля 2012

Основная логика использования const аргументов состоит в том, что это означает, что вы не собираетесь изменять этот аргумент в теле функции, которая его принимает.

Если вы хотите изменить его, не делайтеt const.

И не беспокойтесь о приведении char* к const char*.Для этого есть неявное преобразование.

Вам не нужно менять этот аргумент const char*.Вы можете использовать его для создания std::string объекта и избежать возможной утечки памяти - проверьте ответ по hmjd .

1 голос
/ 06 февраля 2012

Возвращение указателей из функций обычно не имеет смысла в 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);

Например, весь API-интерфейс Windows вызывает функцииименно так, оставляя назначение параметров вызывающей стороне, позволяя функции заниматься только своей задачей (а не распределением памяти и т. д.).

Хотя, конечно, это означает, что вызывающая сторона должна набиратьнесколько строк вместо одного.На этом этапе вы должны спросить себя, что является наиболее важным:

  • для написания чистых интерфейсов функций без неясных возвратов указателей или странных, ненужных утечек динамического выделения, или
  • набрать как можно меньше кода в вызывающей стороне, чтобы уменьшить износ клавиатуры и программиста.
...