C ++很难从深层内部类访问方法

时间:2017-11-30 10:19:18

标签: c++ class pointers methods

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

我猜这不完全是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,这些getter和setter专门用于定位一个特定范围(将有数十个,我认为它非常脏)。
  3. 或使用指针访问我想要修改的确切valueRange(没有 我希望直接从AnalogSensor类打破封装。
  4. 在这种特殊情况下,我可以这样做:

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

    您将如何访问这些值?

1 个答案:

答案 0 :(得分: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);