【问题标题】:Returning libconfig class Setting object reference from function从函数返回 libconfig 类设置对象引用
【发布时间】:2019-10-13 20:19:45
【问题描述】:

我正在尝试使用 libconfig 库从外部配置文件中解析变量。

在libconfig 站点上它说:Config 类代表一个配置,Setting 类代表一个配置设置。请注意,按照设计,这些类都不提供公共复制构造函数或赋值运算符。因此,这些类的实例只能通过引用或指针在函数之间传递。

我很难创建一个返回设置类引用的函数(据我了解,返回对本地对象的引用是不受欢迎的。但我不知道如何声明一个全局引用给定上述限制)。在底部,我附上了我尝试对此进行编码的 sn-p,但是它们不起作用。我是 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);

【问题讨论】:

  • 大概你需要在某个地方保持cfg 活着,那么引用将保持有效。可能您应该将cfg 传递给GetKey,而不是每次调用GetKey 时都打开它?
  • @AlanBirtles 我已经尝试实施您的建议,它奏效了!那是因为key 引用了一个(现在)全局对象cfg,因此key 也是全局对象吗?

标签: c++ libconfig


【解决方案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 后才会被销毁,因此您不应获得悬空引用。

【讨论】:

    猜你喜欢
    • 2020-08-13
    • 2019-06-11
    • 2011-10-21
    • 1970-01-01
    • 2011-09-19
    • 1970-01-01
    • 2012-02-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多