2012-03-17 11 views
1

私は派生クラスのコピーコンストラクタに私の問題を絞り込んだが、原因は不明です。 編集: M、N、およびデータはプライベートです。私が受け取るエラーは、 '無効な割り当てサイズ:4294967295バイト'です - 私が理解するのは、-1を新しいものに渡すときです。私はクラスがcomunicateときにデータが失われない限り、なぜこれが起こるのか分からない。無効な割り当てサイズ(派生クラスのコピーコンストラクタで)

BinaryMatrix::BinaryMatrix(const BinaryMatrix& copy) : Matrix(copy) 
{ 
    //cout << "Copy Constructor\n"; 

    M = copy.M; 
    N = copy.N; 

    data = new double[M*N]; //This line causes the allocation error 

    for (int i = 0; i < M; i++) 
    { 
      for (int j = 0; j < N; j++) 
      { 
        data[i*N+j] = copy.data[i*N+j]; 
      } 
    } 
} 

上記は私の派生したコピーコンストラクタで、エラーが発生します。私は割り当て行に印を付けました。

MとNが正しく読み込まれていないと仮定できます。なぜ私は確信していません。派生コンストラクタとベースコンストラクタの両方と、基本コピーも含めます。

ありがとうございます。

MATRIX(BASE)コンストラクタ

Matrix::Matrix(int M, int N, double* input_data) 
{ 
    this->M = M; 
    this->N = N; 

    //cout << "Matrix Constructor\n"; 
    data = new double[M*N]; 

    for (int i = 0; i < M; i++) 
    { 
      for (int j = 0; j < N; j++) 
      { 
        data[i*N+j] = input_data[i*N+j]; 
      } 
    } 

    delete [] input_data; 
} 

MATRIX(BASE)COPY CONSTRUCTOR

Matrix::Matrix(const Matrix& copy) 
{ 
    //cout << "Copy Constructor\n"; 

    M = copy.M; 
    N = copy.N; 

    data = new double[M*N]; 

    for (int i = 0; i < M; i++) 
    { 
     for (int j = 0; j < N; j++) 
     { 
      data[i*N+j] = copy.data[i*N+j]; 
     } 
    } 
} 

BINARYMATRIX(派生)コンストラクタ

BinaryMatrix::BinaryMatrix(int M, int N, double* input_data) : Matrix(M, N, input_data) 
{ 
    data = new double[M*N]; 

    for (int i = 0; i < M; i++) 
    { 
     for (int j = 0; j < N; j++) 
     { 
      this->data[i*N+j] = this->getRead(i, j); 
     } 
    } 

    double thr_val = this->Mean(); 

    for (int i = 0; i < M; i++) 
    { 
     for (int j = 0; j < N; j++) 
     { 
      if (this->data[i*N+j] > thr_val) 
       this->data[i*N+j] = 1; 

      if (this->data[i*N+j] < thr_val) 
       this->data[i*N+j] = 0; 
     } 
    } 
} 
+0

エラーはどうなっていますか? – Castilho

+0

Doh - 申し訳ありませんが、今私は主な質問にそれを編集します。 – LBHoward

+0

これは実行時エラーかコンパイル時エラーですか? – je4d

答えて

0

MNMatrixにプライベートであり、BinaryMatrixMatrixから派生した場合、あなたのコードがコンパイルされ、なぜ、私は(あなたがBinaryMatrixでM、Nにアクセスできないようにする必要があり)を確認していません。宣言のBinaryMatrixにもメンバーMN(さらにMatrix::NMatrix::M)が含まれている場合は、この問題の原因になる可能性があります。

BinaryMatrixMNを宣言していない場合は、まだ問題を診断するのに十分なデータがないと思います。ちょっと推測すると、おそらくM * NはMに使用される型に適合しません。したがって、算術オーバーフローが発生します。配列のサイズはsize_tで指定されているので、キャストは正常に機能します。

また、データの管理をクラスの1つに委任したいとします。私は何も実際のサイズことを保証しませんので、一般的には、動的なデータ構造を反復処理するためにintを使用するのは良いアイデアではないと思い

#include <algorithm> 

BinaryMatrix::BinaryMatrix(const BinaryMatrix& copy) 
: Matrix(), M(0), N(0), 
    data(0) // null in case new throws an exception (avoid bad delete in dtor). 
{ 
    const size_t nelems(size_t(copy.M)*size_t(copy.N)); 
    data = new double[nelems]; 
    M = copy.M; 
    N = copy.N; 
    stl::copy(copy.data, copy.data+nelems, data); 
} 

BinaryMatrix::BinaryMatrix(const BinaryMatrix& copy) : Matrix(copy) 
{ 
    // M, N, data already set in Matrix::Matrix(const Matrix&) 
    // The data has also been copied, so there is nothing to do here. 
} 

またはこれ:それはどちらか、このんですの構造はintに収まります。ただし、その保証はsize_tのために存在します(存在するオブジェクトのサイズはsize_tでなければなりません。したがって、size_tを使用して連続するオブジェクトを反復処理できます)。

実際、私はMatrixBinaryMatrixからどのような区別(目的や行動)を得ようとしているのかよく分かりません。データは同じ表現をしているようです。相違があるが、あなたが探している表現ではない場合は、継承ではなく、コンポジション(つまり、継承されていない別の表現クラス)を使用するほうが良いかもしれないと思います。継承をいつ使用するかについての有用な考え方の説明については、What is the Liskov Substitution Principle?を参照してください。

しかし、あなたが今までに見た答えのどれも実際に問題を解決するのに役立っていない場合は、あなたの問題を説明するための時間を置いてください。それを投稿する。

+0

優秀、ご協力いただきありがとうございます。これは私に継承と配分のより大きな理解を与えました。 :) – LBHoward

+0

あなたの答えをさらに拡張していただきありがとうございます。個人的に私はこのケースでは継承のポイントを見ません。それは可能な限り最も抽象的な方法であなたに何かを教えてくれるUni課題の1つです。クラスの動作は非常に異なります。バイナリは1と0だけを許可しますが、このデータを保持するために2重を使用します。非常に不経済です。私はまた、0と255の間でデータを正常化するグレースケールを組み替える必要があります。あなたの答えは問題を解決するのに十分な洞察力を提供しました。 Matrix(基底)がすでに行っていることを再定義する必要はありませんでした。 – LBHoward

+0

代わりに、派生したメソッドを使用して、正規化/バイナリへの変換を行うことができます。 Protected型を使用するための再実行の提案に従うことで可能です。 – LBHoward

0

MとNがプライベートであるというエラーがある場合。保護レベルを保護対象またはパブリックに変更するか、またはアクセス方法を提供する必要があります。プライベートな基本クラスで定義されたVairablesは、派生したクラスには負担がかかりません。

class A 
{ 
    int x; 
} 

class B : public A 
{ 
    int DoSomething() 
    { 
     return x; //This is an error X is private to class A and as such inaccessible. 
    } 

} 
1

は、なぜあなたはBinaryMatrixコピーコンストラクタで行列データの新しいコピーを作成するのですか? Matrixのコピーコンストラクタは、BinaryMatrixコピーコンストラクタから呼び出すと、すでにこれを行います。

BinaryMatrixコピーコンストラクタでは、コピーコンストラクタMatrix(既に作成済み)の行列データのコピーを破棄して新しいコンストラクタを作成します。これはメモリリークです。十分頻繁に行うとメモリが枯渇します。

関連する問題