Наличие функции, возвращающей логическое значение и адрес?C ++ - PullRequest
0 голосов
/ 08 января 2012

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

Я загружаю файл из архива и хотел бы, чтобы он возвращал A., если файл был найден, и B. aуказатель на файл в памяти после его загрузки.Я понимаю, что у меня не может быть двух типов возвращаемых данных, поэтому я использую эту функцию как логическое значение, чтобы оно могло более важно сообщить мне, существует ли файл в архиве.Я подумал, что сделаю что-то вроде этого:

// Hold the location of the file
char* location = NULL;

if(!archive.getFile(name, location))
{
    errorLog.writeError("Could not find the file!");
    return false;
}

Если файл не найден, функция, вызывающая getFile, вернет false, указывая, что файл не найден.Это прекрасно работает.Но я пытаюсь выяснить, как напрямую изменить указатель 'location' из функции getFile.

Я передаю указатель?Или я передаю адрес указателя и изменяю его?

Вот функция в моем заголовке:

bool archive::getFile(string filename, char& location)

Итак, резюмируя, я хочу передать в 'location'указатель, пусть он указывает на файл в архиве из функции getFile, а затем, когда он вернется, сможет использовать указатель 'location' для доступа к файлу.

Спасибо.

Ответы [ 4 ]

3 голосов
/ 08 января 2012

Просто верните указатель и нулевой указатель, если вещь не найдена.

char *getFile(std::string name) {
  return nullptr; // or just 0
}

Тогда вы можете сделать:

if ((location = archive.getFile(name)) != 0) {
   // found
}

Но это похоже на C-код. В качестве альтернативы:

  • вернуть пустую std::string в случае ошибки
  • возвращает bool, но передает неконстантную ссылку на строку

Или действительно передать указатель на указатель или ссылку на указатель, но это наименьший «идиоматический» C ++, который вы можете сделать IMO.

1 голос
/ 08 января 2012

Прежде всего, объявление вашей функции некорректно, оно не должно получать ссылку на char (char &), а указатель на char.Это должно быть:

bool archive::getFile(string filename, char* location)

Если вы хотите изменить указатель, вы должны передать указатель на него (т.е. двойной указатель) или ссылку на указатель (что, на мой взгляд, не является хорошим решением - смешивание ссылоки указатели могут запутаться).Так что на самом деле вот как должно выглядеть объявление

bool archive::getFile(string filename, char** location)

В стандартной библиотеке всякий раз, когда требуется функция, которая возвращает указатель и должна указывать, был ли указатель успешно создан, NULL возвращаетсяуказанная ошибкаПоэтому рассмотрите возможность объявления вашей функции:

char* archive::getFile(string filename)

И сделайте так, чтобы она возвращала местоположение, если файл присутствует в архиве, и NULL, если его нет.

1 голос
/ 08 января 2012

Вы можете использовать структуру или даже класс, содержащий логическое значение и указатель, который вы хотите вернуть:

struct MyType
{
  bool exist;
  char* whatever;
};

и ваша функция возвращает структуру MyType.

0 голосов
/ 08 января 2012

Вы можете поместить два значения в std :: pair.Я обычно предпочитаю, чтобы каждая переменная использовалась только для одного использования, но существует традиция перегрузки указателя с NULL, чтобы означать что-то еще.Если вам нужно вернуть более двух значений, вы можете использовать boost :: tuple.

...