【问题标题】:Instantiate member from class inside library inside current class?从当前类中的库内的类中实例化成员?
【发布时间】:2021-01-25 22:21:23
【问题描述】:

我觉得我在这里遗漏了一些明显的东西,需要指出。 我正在尝试创建一个结构的实例,它是包含在当前文件中的库中包含的类的成员,但在我自己定义的类中。如果我在类之外执行此操作,它可以工作,但在类内部,它似乎试图实例化结构,就好像它是它所在的父类的成员一样。

该库用于 BME280 传感器,结构是将芯片设置传递给驱动传感器的主类的构造函数。甚至不知道如何表达这个问题,但希望代码能说明我想说的。

如果我在一个类之外实例化这个结构,它就可以正常工作,

#include <BME280I2C.h>

// BME280 sensor settings
BME280I2C::Settings settings(
  BME280::OSR_X16,
  BME280::OSR_X16,
  BME280::OSR_X16,
  BME280::Mode_Forced,
  BME280::StandbyTime_1000ms,
  BME280::Filter_Off,
  BME280::SpiEnable_False,
  BME280I2C::I2CAddr_0x76 // I2C address. I2C specific.
);

class UsermodBME280 : public Usermod {
  private:
    BME280I2C bme(settings);
};

但如果我尝试在类中执行此操作,它似乎会尝试将结构实例化,就好像它是 UsermodBME280 类本身的成员一样。

#include <BME280I2C.h>

class UsermodBME280 : public Usermod {
  private:
    // BME280 sensor settings
    BME280I2C::Settings settings(
      BME280::OSR_X16,
      BME280::OSR_X16,
      BME280::OSR_X16,
      BME280::Mode_Forced,
      BME280::StandbyTime_1000ms,
      BME280::Filter_Off,
      BME280::SpiEnable_False,
      BME280I2C::I2CAddr_0x76 // I2C address. I2C specific.
    );

    BME280I2C bme(settings);
};

IntelliSense 说明了我的意思: https://i.stack.imgur.com/14ql5.png

我可以这样做吗?如果是这样,我做错了什么?

【问题讨论】:

    标签: c++ class struct include


    【解决方案1】:

    是的,可以默认初始化成员,尽管在 C++ 标准中类内初始化只能使用 ={}。最好回答here

    使用括号会让人困惑,因为它看起来像一个函数声明。 IntelliSense 最有可能抱怨错误类型,因为它认为您正在声明一个具有无效类型和返回类型为 BME280I2C::Settings 的函数(假设您提供的设置值是值而不是类型)。

    假设存在非显式构造函数,初始化可能如下所示(注意从 (){} 的变化)

    #include <BME280I2C.h>
    
    class UsermodBME280 : public Usermod {
      private:
        // BME280 sensor settings
        BME280I2C::Settings settings{
          BME280::OSR_X16,
          BME280::OSR_X16,
          BME280::OSR_X16,
          BME280::Mode_Forced,
          BME280::StandbyTime_1000ms,
          BME280::Filter_Off,
          BME280::SpiEnable_False,
          BME280I2C::I2CAddr_0x76 // I2C address. I2C specific.
        };
    
        BME280I2C bme{settings};
    };
    

    【讨论】:

    • 非常感谢,我也阅读了你链接的帖子,不知道它是一个 Thing™,甚至被命名为最令人烦恼的 Parse,现在对我来说完全有意义你已经指出来了。
    猜你喜欢
    • 1970-01-01
    • 2014-05-18
    • 1970-01-01
    • 1970-01-01
    • 2016-08-03
    • 2015-02-17
    • 1970-01-01
    • 2012-07-05
    • 1970-01-01
    相关资源
    最近更新 更多