3

本当に単純なことで助けが必要ですが、C++では非常に困難です。行列を初期化して処理することを目的として、ラティスというクラスを作成しました。次のプライベートメンバーがあります。

private unsigned dim;
private double matrix [dim][dim];

クラスのコンストラクターでパラメーターを使用して変数dimを初期化したいのですが、コンパイラーは引き続きエラーを返します。dimを公開して静的にし、メインプログラムで初期化しようとしましたが、まだ問題があります。この単純なクラスを作成するにはどうすればよいですか?

さらに、マトリックスの値を更新するために、クラスにいくつかのメソッドも実装しました。メインプログラムでクラスのオブジェクトを初期化し、その「更新」メソッドを使用して、マトリックスの値が1回だけ保存されるというのは本当ですか?

ご協力ありがとうございました。

4

3 に答える 3

2

このようなクラスを作成するには、(少なくとも) 3 つの方法があります。

  • とともにtemplate

    template<size_t dim>
    class Matrix
    {
       private:
         double matrix[dim][dim];
    }
    
  • 次のような組み込み型を使用するとstd::vector(たとえばvalarray、機能することもあります)

    #include <vector>
    class Matrix
    {
       private:
         size_t dim;
         std::vector<std::vector<double> > matrix;
       public:
         Matrix(size_t dim_) : dim(dim_), matrix()
         {
           matrix.resize(dim);
           for ( size_t i = 0; i < dim; ++i )
              matrix[i].resize(dim);
         }
    }
    
  • 単純な配列を使用する (お勧めしません!)

    class Matrix
    {
       private:
         size_t dim;
         double** matrix;
       public:
         Matrix(size_t dim_) : dim(dim_), matrix()
         {
           matrix = new double*[dim];
           for ( size_t i = 0; i < dim; ++i )
              matrix[i] = new double[dim];
         }
         ~Matrix() // you need a destructor!
         {
           for ( size_t i = 0; i < dim; ++i )
              delete [] matrix[i];
           delete [] matrix;
         }
    }
    
于 2012-10-21T17:15:59.223 に答える
1

テンプレートを使用:

template<int dim>
class Lattice{
    double matrix[dim][dim];
}

コンストラクターで dim を初期化します。

Lattice<10> sampleLattice;

それからdim = 10;

ポインターやベクトルのベクトルを使用することもできますが、混乱が少なく便利なテンプレートを使用します。

ところでprivate:、and public:(コロン付き) を使用する必要があります。

于 2012-10-21T17:14:48.177 に答える
0

あなたの「問題」は、非定数サイズでの配列の初期化について不平を言うコンパイラーだと思います。

次のようにする必要があります。

class MyClass {
public:
    MyClass(unsigned pdim);
private:
    MyClass();
    const unsigned dim;
    const double matrix [dim][dim];
};

MyClass::MyClass(unsigned pdim) : dim(pdim) {
    // Other things
}

クラス内に const メンバーを含めることができますが、:構文を使用して初期化する必要があります。

于 2012-10-21T17:14:46.987 に答える