2011-01-07 7 views
0

固定長の配列であるデータメンバーを含める方法があるかどうか疑問に思っていました。クラス内のC++変数配列問題

関数initModulationは、サイズMのint配列とサイズMのComplex配列を作成します(複合は別のクラスであり、実数成分と虚数成分で構成されます)。

関数変調は、これらの2つの配列にアクセスできる必要があります。これらの2つの配列は、init Modulation関数が呼び出された後に範囲外になります。これを避けるために、私はちょうどしかし、私は、配列のサイズはM.

class Modulator 
{ 
    int M; 
    double phase; 
    std::string mapping; 

public: 
    void initModulation(int M, double phase, std::string mapping); 
    double* modulate(int *input,int inputlength,int complexFlag); 
}; 

この周りの任意のアイデアに依存しているため、それを行うことができない、変調クラスのこれらの二つのデータメンバになるだろうか?

おかげで、 ミン

+0

std :: complexが気になります。車輪を再構築するよう強制しないでください。 – IAE

答えて

1
  1. は非常に特別な事情なしに初期化関数を記述しないでください。コンストラクタで構築

  2. 配列は、変調に使用されるので、クラスデータの論理的な部分であり、それはクラスのインスタンスであるため、メンバとして持つ必要があります。

  3. コンパイル時に不明なサイズの配列を作成する予定でしたか?それをクラスのメンバーとして保管しているかどうかはどういう意味がありますか?いずれにせよ、あなたはこの時点でMに関する情報を持っており、それに応じてそれを使用します。

  4. しかし、とにかく自分の配列を割り当てるべきではありません。 std::vectorを使用してください。結局のところ、テキストデータにはstd::stringを使用するほどスマートです。

  5. 「フラグ」と呼ばれるパラメータには、なぜintを使用しますか? C++には真のブール型があり、boolと呼ばれます。これを使って。

  6. 変調の入力と出力については、やはりベクトルを使用してください。

  7. 名前がクラス名と一致するメンバー関数を持つクラスを持つことは疑わしいです。多くの言語が "呼び出し可能な"オブジェクトの概念をサポートしており、C++もその中にあります。 C++では、この機能のスペルは "operator()"です。したがって

:現代のC++へ

class Modulator 
{ 
    std::vector<int> int_data; 
    std::vector<Complex> complex_data; 
    double phase; 
    std::string mapping; 

    public: 
    Modulator(int M, double phase, std::string mapping): 
    int_data(M), complex_data(M), phase(phase), mapping(mapping) {} 

    std::vector<double> operator()(const std::vector<int>& input, bool is_complex); 
}; 

ようこそ。 :)

1

あなたは配列のようであるが、可変サイズを有し、明示的なメモリ管理を必要としませんstd::vectorクラスを使用することができます。 1つをデータメンバーとして宣言する場合、initModulationには好きなだけ多くの要素を入力できますが、利用できるデータはmodulateです。

1つの提案 - initModulationをクラスコンストラクタに変更することをお勧めします。そうすれば、自動的に呼び出され、最初にオブジェクトを初期化せずにmodulateを呼び出すリスクはありません。

1

I was wondering if there was a way to include a data member which is an array of unfixed size.

STLは、あなたが探しているものはおそらくです(std::vector ...