• 締切済み

自作の行列クラスを継承するさいにエラーがでます

現在、c++の学習で、自作の基底行列クラスMatrixを作成し、このクラスを継承して新たにlduMatrixを作成する事を考えています。 が、継承し、 lduMatrix a( 3, 3); a = 3; とすると、 main.C:13: warning: passing ‘double’ for argument 1 to ‘lduMatrix::lduMatrix(int)’ というエラーがでてコンパイルできずにいます。その一方で、 lduMatrix a(3,3, 3.14); とするとコンパイルはとおり、lduMatrix行列の各要素(a[1][1]など)の値をプリントさせると、[[3.14]]の値が入っていることを確認しております。 どこが間違っているのか御指導いただけると幸いです。 以下、クラスの中身です。よろしくおねがいします。 《Class: Matrix》 #include <iostream> class Matrix{ private: //! Size of row and column in Matrix int row_, col_; //! Row pointers double** m_; //! Allocate function for row-pointers void allocate(); public: Matrix(); //! Constructor with given matrix size Matrix( const int, const int ); //! Constructor with given matrix size and value fro all elements Matrix( const int, const int, const double ); //! Destructor ~Matrix(); ・・・省略・・・ double* operator[]( const int ); double* operator[]( const int ) const ; void operator=( const double ); }; /* Private functions *********************************************** */ void Matrix::allocate() { m_ = new double* [row_]; m_[0] = new double [row_*col_]; for ( int i=1; i<row_; i++ ){ m_[i] = m_[i-1] + col_; } } /* Destructor ****************************************************** */ Matrix::~Matrix(){ delete[] m_[0]; delete[] m_; } /* Constructors **************************************************** */ // NULL constructor Matrix::Matrix() : row_(0), col_(0), m_(NULL) {} // Constructor with given matrix size Matrix::Matrix( const int row, const int col ) : row_(row), col_(col) { allocate(); } // Constructor with given matrix size and value for all elements Matrix::Matrix( const int row, const int col, const double s ): row_(row), col_(col) { allocate(); double* m = m_[0]; for ( int i=0; i<row_*col_; i++ ){ m[i] = s; } } 《省略》 /* Member operators ************************************************ */ double* Matrix::operator[]( const int i ){ return m_[i]; } void Matrix::operator=( const double t ){ double* m = m_[0]; int nm = row_*col_; for ( int i=0; i<nm; i++ ) { m[i] = t; } } 《Class: lduMatrix》 class lduMatrix : public Matrix{ public: lduMatrix(); lduMatrix( const int ); lduMatrix( const int, const double ); }; lduMatrix::lduMatrix() {} lduMatrix::lduMatrix( const int mSize ) : Matrix( mSize, mSize, 0.0 ) {} lduMatrix::lduMatrix( const int mSize, const double s ) : Matrix( mSize, mSize, s ) {}

みんなの回答

  • koko_u_
  • ベストアンサー率18% (459/2509)
回答No.3

スマン、分からんようになってしまった。識者の登場を待て。 わしに分かるのは、Matrix が m×n 行列でこれを継承して正方行列 lduMatrix を作成しようとしているのだが、この設計は明らかに間違っているということくらいだ。 長方形クラスから正方形クラスを継承するのと同じ誤りだと思う。 継承した場合、派生クラスでは基底クラスの non-virtual な public メンバーを隠蔽してはいけません。これは絶対です。 今回のように目的の動作をさせるために、メンバー関数を再定義する必要が発生した場合、設計を見直した方が良いです。 というかポリモーフィックな動作をさせる必要がないのであれば、大抵継承自体不要です。

carnot
質問者

お礼

コメント、ありがとうございます!! 御指摘、ごもっともで、必ずしも継承を使う必要は無いんですよね。 c++の勉強がてら、基底クラスMatrixで行列の基礎部分を定義しておき、派生クラスで三重対角行列や三角行列等の定義、および行列解法を組み込もうかなと、考えていたもので。 自分の方でももう少し検討してみます。

  • noconan
  • ベストアンサー率0% (0/1)
回答No.2

自分も学習のみなのですが、感想をいいますね。 おそらくNo1さんの指摘したとおりだと思います。 解決策として、基底クラスで派生クラスをインスタンス化すれば解決できるかもしれません。 ちょっと気になったこと: 派生クラスに引数が3つのコンストラクタがないのですが・・・・・lduMatrix a(3,3, 3.14); とするには必要ですよね・・・・ ここに掲示していないところで記述してあるってことかな? 間違ってたらごめんなさい・・・・・

carnot
質問者

お礼

コメント、ありがとうございます。 基底クラスの方の省略した部分に引数3のコンストラクタがありますので、こちらを使用してlduMatrix(3,3,3.14)を実現しています。

  • koko_u_
  • ベストアンサー率18% (459/2509)
回答No.1

>lduMatrix a( 3, 3); >a = 3; だと、a = 3 で代入演算子 operator= が呼出され、これが lduMatrix に定義されていないので Matrix::operator=(const double) が呼ばれているのでしょう。 lduMatrix a = 3; とすれば lduMatrix::lduMatirx(const int) が呼ばれると思います。

carnot
質問者

お礼

コメント、ありがとうございます。 お蔭様で、問題が解決されました。 御指摘のとおり、 lduMatrix a = 3; とすることにより、コンパイル時のエラーがなくなりました。 ただ、これですと目的の動作(値3を全ての行列要素に代入する)を行っていないので、lduMatrix classに、 void lduMatrix::operator=(const double s){ Matrix::operator=(s); } を追加いたしました。 ここで、新たな疑問なのですが、継承した場合、一般に基底クラスのpublicのメンバ関数は派生クラスでも使用することが出来ると思います。が、今回の場合ですとoperator=を派生クラスにて再定義しないといけませんでした。これは、どのように解釈すれば良いのか、お教え願えないでしょうか??? 例えば今回の行列クラスにおいて、基底クラスMatrixで各行列要素をプリントするprint()関数を定義すると、特に派生クラスlduMatrixにてprint()を再定義する必要は無く、mainにおいて lduMatrix a(3,3.14); a.print(); とすれば、基底クラスのprint()関数をlduMatrixを介して呼び出すことが出来ます。  operator=と上記との違いをお教えいただけると幸いです。よろしくおねがいします。

関連するQ&A