Возвращение класса libconfig Установка ссылки на объект из функции - PullRequest
0 голосов
/ 28 мая 2019

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

На libconfig сайте написано: Класс Config представляет конфигурацию, а класс Setting представляет настройку конфигурации.Обратите внимание, что ни один из этих классов не предоставляет открытый конструктор копирования или оператор присваивания.Поэтому экземпляры этих классов могут передаваться между функциями только через ссылки или указатели.

У меня возникли трудности при создании функции, которая будет возвращать ссылку на класс Setting (насколько я понимаю, возвращая ссылку на локальный объектне одобряется, но я понятия не имею, как объявить глобальную ссылку с учетом приведенного выше ограничения).Внизу я приложил фрагмент моей попытки закодировать это, однако они не работают.Я новичок в C ++ и в настоящее время читаю учебник по нему, но я все еще неуверен в своей обработке ссылок и указателей.Буду признателен, если кто-нибудь сможет пролить свет на то, что я делаю неправильно.

config.cfg

A=
{
  min = 3;
}

Код

libconfig::Setting& GetKey(const char* filename, const char* method)
{
  libconfig::Config cfg;
  cfg.readFile(filename);
  libconfig::Setting &root = cfg.getRoot();
  libconfig::Setting &key = root[method];

  // How can I return key?
}

libconfig::Setting &key = GetKey("config.cfg","A");
key.lookupValue("min",min);

1 Ответ

1 голос
/ 28 мая 2019

Значения, возвращаемые различными методами в libconfig::Config, являются ссылками на объекты, содержащиеся в объекте libconfig::Config.

Из документации не ясно, как долго эти ссылки будут действительны, но они, безусловно, будут недействительными, когда объект cfg будет уничтожен. Они могут быть признаны недействительными, если вы внесете изменения в объект cfg, но это не указано в документации.

Должна работать реструктуризация вашего кода следующим образом:

libconfig::Setting& GetKey(libconfig::Config& cfg, const char* method)
{
  libconfig::Setting &root = cfg.getRoot();
  libconfig::Setting &key = root[method];

  // How can I return key?
}

libconfig::Config cfg;
cfg.readFile("config.cfg");
libconfig::Setting &key = GetKey(cfg,"A");
key.lookupValue("min",min);

cfg не уничтожается до тех пор, пока вы не перестанете использовать key, поэтому вы не должны получать висячие ссылки.

...