【问题标题】:C++ difficulties accessing method from a deep inner class [closed]C++ 难以从深层内部类访问方法 [关闭]
【发布时间】:2018-05-14 05:40:06
【问题描述】:

我的项目中有几个类,其中一些类是其他类的成员。在操作外部类时,我想访问其成员类的一些参数(它们也可以有自己的成员类)。

我猜这并不是 C++ 中的“嵌套类”,因为嵌套类是在外部类的声明中声明的。那么嵌套类可能无法从外部类的外部访问(对我来说只是一条信息,以确保我不写垃圾)。

假设我有一个 AnalogSensor 类(处理真实模拟传感器的行为)。此类可能有多个处理程序(一个用于处理 ADC 请求,一个用于过滤传入数据,一个用于数据处理,最后一个用于死区管理)。

class LinearSpace {
   public:

   // Getters & setters
   private:
      uint16_t min_val; // I'm working with embedded devices
      uint16_t max_val; // Those are values used for linear interpolations
                        // purposes
};


class DataHandler {

   public:
      // Some useful methods
      uint8_t map_raw_data(); // Converts the mapped adc_result (10 bits)
                              // value into an 8-bit, interpolated value
   private:
       LinearSpace input_space;  // Two values spaces used for interpolation
                                 // purposes
       LinearSpace output_space;
};


class AnalogSensor{

   public:
       // "High-Level" methods like void send_adc_request(void);
       // which relies on the internal ADC hander

   private :
      AdcHandler adc_handler;
      DataHandler data_handler;
      Deadzone deadzone;
      DataFilter data_filter;
};

每个处理程序都可能依赖(或不依赖)其他子类,例如具有自己的 getter 和 setter(getmin、getmax、setmin 和 setmax)的值范围(最小值、最大值)。

这是我可以在项目中结束的示例:

AnalogSensor mysensor
   |
    - dataHandler data_handler
      |
       - LinearSpace input_space
      |  |
      |   - min_val
      |  |
      |   - max_val
      |
       - LinearSpace output_space
         |
          - min_val
         |
          - max_val

好吧,现在假设我想修改给定范围的最小值和最大值,直接来自 AnalogSensor 类。我应该怎么做?

此要求来自对每个校准过程(在运行时)调整这些值的必要性,因为电压和电子测量可能会随时间/外部条件(例如湿度等)而变化。

我在网上找到了很多想法:

  1. 将一个类声明为朋友(AnalogSensor 是 AdcHandler 和 dataFilter 等...)
  2. 在 AnalogSensor 中声明尽可能多的 getter 和 setter,它们专用于一个特定的范围(会有几十个,我认为这很脏)。
  3. 或者使用指针访问我想要修改的确切 valueRange(没有 我希望打破封装)直接来自 AnalogSensor 类。

在这种特殊情况下,我可以这样做:

mysensor.getDataHandlerPointer()->getInputSpacePointer()->set_min(my_new_value);

您将如何访问这些值?

【问题讨论】:

  • 你如何解释为什么你(我引用)“想要直接从 AnalogSensor 类修改给定范围的最小值和最大值。”。是否需要这样做取决于 AnalogSensor 类需要做什么。如果没有这种解释,就没有上下文可以建议您构建班级的方式是否合适,或者您想要设置成员的方式是否有意义 - 更不用说就合适的方法提供建议了。
  • 实际上,我仍在为我的课程寻找更好的结构。我的边界可能会随时间而变化(测量中的噪声、校准等)。这可能会导致 AnalogSensor 无法达到其范围的限制,然后我想确保我可以在运行时调整和调整这些限制。也许不需要专门的处理程序来做到这一点,对我来说直接在 AnalogSensor 的主体中实现它会容易得多。

标签: c++ class pointers methods


【解决方案1】:

如果您要更改和监视数十个范围,最好将它们存储在(一个)数组中,并按索引引用范围。即:

struct my_s
{
    enum RangeSpace { input_space, output_space, N_SPACES };

    void setRange(RangeSpace id, int min, int max) { spaces_[id].setMinMax(min, max); }

    // etc...

  private:
    LinearSpace spaces_[N_SPACES];
};

在调用时使用常量时,这样的索引会很好地优化,如:

//...
my_s s;
int a = 0, b = 0;
//...
s.setRange(my_s::input_space, a, b);

【讨论】:

  • 如果我理解正确,我会得到一个特殊的结构来处理我程序的所有范围?所以如果我有一个 AnalogSensor a_sensor;如果我想访问它的范围,我可以这样做: s.setRange(a_sensor.inputSpaceIndex, a,b); ? (它与您的实现不完全对应,但有点类似)。这应该够了吧。我在想一些更“内部”的东西,但这是一个很好的解决方案。谢谢
  • 是的。当参数(或统计数据)存在于静态内存、eeprom 等中时,这种结构也很实用……它也使串行传输代码不那么冗长。
  • 非常感谢!我喜欢这种嵌入式友好的解决方案,因为我真的很关心优化内存和处理能力。我担心使用过多的类可能会让我的微型 CPU 无法处理(...)。
  • 很高兴我能帮上忙 :) 这个技巧确实来自原力的嵌入式方面。
猜你喜欢
  • 2015-02-25
  • 2015-07-09
  • 2020-05-09
  • 2021-09-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多