在当前 class 内的库中从 class 实例化成员?

Instantiate member from class inside library inside current class?

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

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

如果我在 class 之外实例化这个结构,它工作正常,

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

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

#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++ 标准中 in-class 初始化只能使用 ={}。这个回答更好 here.

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

假设存在 non-explicit 构造函数,初始化可能看起来像这样(注意从 (){} 的变化)

#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};
};