Возврат ссылки на объект настройки класса libconfig из функции

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

На сайте libconfig написано: Класс < href="https://github.com/hyperrealm/libconfig/blob/master/lib/libconfig.h%2B%2B#L439" rel="nofollow noreferrer">Config представляет конфигурацию, а class Setting представляет параметр конфигурации . Обратите внимание, что по дизайну ни один из этих классов не предоставляет открытого конструктора копирования или оператора присваивания. Поэтому экземпляры этих классов можно передавать между функциями только через ссылки или указатели.

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

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);

person nasw_264    schedule 28.05.2019    source источник
comment
предположительно вам нужно где-то сохранить cfg, тогда ссылки останутся действительными. возможно, вам следует передать cfg в GetKey, а не открывать его каждый раз, когда вы вызываете GetKey?   -  person Alan Birtles    schedule 28.05.2019
comment
@AlanBirtles Я попытался реализовать ваше предложение, и это сработало! Это потому, что key ссылался на (теперь) глобальный объект cfg и, следовательно, key также является глобальным?   -  person nasw_264    schedule 28.05.2019


Ответы (1)


Значения, возвращаемые различными методами в 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, поэтому вы не должны получать оборванные ссылки.

person Alan Birtles    schedule 28.05.2019