2017-11-30 8 views
0

私のプロジェクトにはいくつかのクラスがあり、それらのクラスのいくつかは他のクラスのメンバーです。 Outerクラスを操作している間、私はそのメンバクラスのいくつかのパラメータにアクセスしたいと思います(独自のメンバクラスを持つこともできます)。深い内部クラスからのメソッドへのアクセスにC++の困難があります

これは、ネストされたクラスが外部クラスの宣言内で宣言されているので、これはC++の "ネストされたクラス"とはまったく異なります。次に、ネストしたクラスは、Outerクラスの外部からアクセスすることはできません。 (ちょっとした情報で、私はゴミを書かないようにしています)。

私は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 usefuls methods 
     uint8_t map_raw_data(); // converts the mapped adc_result (10 bits) 
           // value into 8-bit, interpoled value 
    private: 
     LinearSpace input_space; // 2 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; 
}; 

独自のゲッターとセッター(getmin、getmax、setmin、setmax)を有している値の範囲のような、他のサブクラスに依存している(またはしない)ことがあり、それらのハンドラ(最小値、最大値)のそれぞれ。ここで

は、私は私のプロジェクトでで終了することができるものの例である:

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

まあ、今AnalogSensorから直接、私は与えられた範囲の最小値とmaximuml値を変更したいと言うすることができますクラス。どうすればよいですか?

編集:電圧と電子測定は、水分などの時間/外部条件に応じて変化することができるように、この要件は、(実行時に)各キャリブレーション処理のためにこれらの値を調整する必要性から来るなど

Iインターネット上の多くのアイデアが見つかりました:

  1. は友人としてクラスを宣言し
  2. が同じくらいゲッターとを宣言(AnalogSensorは AdcHandlerとdataFilterなどの友人は...です) 1つの 特定の範囲をターゲットに専念していAnalogSensor内部のセッターは、(それらの数十があるだろうと私はそれはかなり汚れていると思います)
  3. それとも アクセス私は修正したい正確なvalueRangeへのポインタを使用して( カプセル化Iを壊すことなく、希望)をAnalogSensorクラスから直接得ることができます。あなたがそれらの値にアクセスするだろうどのように

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

    :この特定のケースで

は、私はこのような何かを行うことができますか?

+0

AnalogSensorクラスから直接与えられた範囲です。 "その必要性は、AnalogSensorクラスが何をする必要があるかによって決まります。その説明がなければ、クラスを構成する方法が適切であるかどうか、またはメンバーを設定する方法が合理的であるかどうかをアドバイスするためのコンテキストはありません。 – Peter

+0

実際、私はまだ自分のクラスのためのより良い構造を探しています。私の境界は時間と共に変化するかもしれません(測定、キャリブレーションなどのノイズ)これはAnalogSensorがその範囲の限界に達しないようにする可能性があり、実行時にその制限を微調整して調整できるようにします。 そうするために専用のハンドラを用意する必要はないかもしれませんが、AnalogSensorの本体の中に直接実装する方がはるかに簡単です。 – bebenlebricolo

答えて

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]; 
}; 
呼び出すときのように、定数を使用するときに

このようなインデックスがうまく最適化します:あなた(と私は引用)なぜあなたは説明については、「最小値とのmaximuml値を変更する方法

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

私が正しく理解すれば、私のプログラムのすべての範囲を扱う特別な構造が得られますか?ですから、私がAnalogSensor a_sensorを持っていれば、その範囲にアクセスしたい場合は、次のようなことができます。 s.setRange(a_sensor.inputSpaceIndex、a、b); ? (これはあなたの実装に正確には対応していませんが、その味の何か)。 それはそのトリックを行う必要があります。私は何か「内部」を考えていましたが、それは良い解決策です。ありがとう – bebenlebricolo

+0

はい。この種の構造は、パラメータ(または統計情報)が静的メモリ、eepromなどに存在する場合にも実用的です。シリアル転送コードのワード数も少なくなります。 –

+0

ありがとう!この埋め込み型のソリューションが気に入っています。メモリと処理能力を最適化することが本当に心配です。私はあまりにも多くのクラスを使用して私の小さなCPUが(...)処理するために重くなるかもしれないことを畏敬の念です。 – bebenlebricolo

関連する問題