そのクラスが多数のプライベート定数を定義しているときに、クラス宣言内から別のファイルを #include してはならない理由はありますか?
単純な状態遷移システムに準拠し、それぞれが一連のステップで構成される複数の状態からなる処理スケジュールを定義するクラスを作成しています。クラスはさまざまな関数でこれらの状態とステップを参照する必要があるため (たとえば、現在の状態とステップに基づいて適用する処理を決定する場合)、実装を行うためにクラスの宣言内で一連のプライベート列挙型を定義することになります。読み取り可能です (したがって、これらの状態とステップに関連付けられた生の整数値を使用するだけでなく、kStates_ModeTransition や kStateSteps_ModeTransition_PrepareNewSetup などを参照できます)。
状態と状態ステップのリストが長くなるにつれて、この列挙型のコレクションは、クラス宣言の途中でかなり長くてぎこちないコードの塊になりました。これらの定数は、インターフェイスよりも実装に関連しているように感じます-クラスのユーザーは、必ずしもそれらについて知る必要はありません。これらの列挙型をすべて別のファイルに移動してから、そのファイルをクラス宣言のプライベート セクションに #include するべきではない理由はありますか? クラスの本体内で #include を使用することが適切であると思われる別の状況に遭遇したことはないので、これを処理するより良い方法があるかどうか、またはそのような #include が悪い形式になる特定の理由があるかどうか疑問に思っています。さらに、そのようなファイルで使用する適切な標準ファイル拡張子はありますか? テキスト挿入にのみ使用されます (実際にはヘッダーではありません...)? .txtだけですか?
ありがとう!
編集:言及された代替手段の1つが私のジレンマを完全に解決するかどうかを確認するためにもう少し:
本質だけに固執しようとしている、これが私の現在の構造の例です
// Processor.h
class Processor
{
public:
Processor();
void Process( float* input, float* output, int numSamples );
private:
// List of possible states
enum
{
kStates_Default,
kStates_SettingChangeImmediate,
kStates_SettingChangeCrossfade,
kStates_SpecialProcessing,
kStates_NumStates
};
// Lists of steps for each state...
enum
{
kStateSteps_Default_PrepareInput,
kStateSteps_Default_CalculateIntermediateValues,
kStateSteps_Default_CalculateOutput,
kStateSteps_Default_NumSteps
};
// Imagine more lists for other states here, with comments...
// Becoming quite long...
// Private functions used in implementing various processing steps
// (some are used by multiple state-steps in varying ways)
void PrivateFunction1();
void PrivateFunction2();
// Some member variables here
};
これは、ブロック処理タスクを実行する際の DSP 負荷のバランスを改善するために、リアルタイム処理コンテキストで使用されます。実際には、このクラスは、Process への呼び出しの実際のスケジューリングを処理する基本クラスから継承し、必要に応じて現在の状態と状態ステップを更新します。Process() は、オブジェクトの現在の状態と状態ステップに基づいて、特定の処理機能と IO を実行する switch ステートメントで構成されます。
列挙型で宣言された値は、Process() および processor.cpp 内の他のプライベート メンバー関数内で使用され、それ以外の場所では使用されません。クラス内にスコープを設定するために、これらをプライベート メンバー変数として宣言しました。それらを .cpp 内で宣言し、同じスコープを達成する方法はありますか? これらはすべて、コンパイル時に最適化された定数整数であることを意図しており、本質的に #define として使用されています - 私はマクロを使いたくないだけです。