1

私は分かりませんが、コピーコンストラクタや演算子=が正しくありません。 2つの "墓"でテストしたところ、プリンタは動作していましたが、プログラムの終わりにコンパイラは "デバッグアサーションが失敗しました"と言っていました。コメントを1としてVectorクラスのoperator =を作る方法は?

#pragma once 
#include <cstdio> 
#include <cmath> 
#include <iostream> 
#include <cstdlib> 

class tomb { 
private: 
    double *adat; 
    int szam; 
public: 
    tomb(){ 
     adat = NULL; 
     szam = 0; 
    } 
    tomb(const tomb &u) { 
     adat = u.adat; 
     szam = u.szam; 
    }; 
    int meret()const { 
     return szam; 
    } 
    ~tomb() { 
     delete[] adat; 
    } 
    double & operator[](int n) { 
     return adat[n]; 
    } 
    const double & operator[](int n)const { 
     return adat[n]; 
    } 
    const tomb &operator=(const tomb &a) { 
     adat = a.adat; 
     szam = a.szam; 
     return *this; 
    } 
    tomb elso_valahany(int n) { 

    } 

    void push_back(const double &a) { 
     double *tmp; 
     tmp = new double[szam+1]; 

     for (int i = 0; i < szam; i++) 
     { 
      tmp[i] = adat[i]; 
     } 

     tmp[szam] = a; 
     delete[] adat; 
     adat = tmp; 
     ++szam; 
    } 
    void Kiir()const { 
     for (int i = 0; i < szam; i++) 
     { 
      std::cout << adat[i] << "\n"; 
     } 
    } 
}; 
+0

どちらも間違っています。 –

+0

なぜ動的割り当てを使用していますか? –

+1

両方のデストラクタが 'delete []'をしようとすると、 'tomb'からポインタをコピーするのは間違いです。これは、同じポインタの明らかな二重削除です。 –

答えて

0

、私は深いコピーを実行する方法を紹介します:あなたは、クラスをコピーするたびに、あなたの代わりに、単にデータへのポインタが、全体のベクトルをコピーすることはありません。

また、簡略化のために、私はSTDを使用します::ベクトル:

#pragma once 
#include <cstdio> 
#include <cmath> 
#include <iostream> 
#include <cstdlib> 
#include <vector> 

class tomb { 
private: 
    std::vector<double> adat; 
    int szam; 
public: 
    tomb(){ 
     szam = 0; 
    } 
    tomb(const tomb &u) : adat(u.adat), szam(u.szam) 
    { 
     adat = u.adat; 
     szam = u.szam; 
    }; 
    int meret() const { 
     return szam; 
    } 
    ~tomb() { 
    } 
    double & operator[](int n) const { 
     return adat[n]; 
    } 
    const double & operator[](int n) const { 
     return adat[n]; 
    } 
    tomb& operator=(const tomb &a) { 
     adat = a.adat; 
     szam = a.szam; 
     return *this; 
    } 


tomb elso_valahany(int n) { 

    } 

    void push_back(const double &a) { 
     adat.push_back(a); 
     ++szam; 
    } 
    void Kiir()const { 
     for (int i = 0; i < szam; i++) 
     { 
      std::cout << adat[i] << "\n"; 
     } 
    } 

私がテスト/コンパイルしていませんが、メモリ管理がで行われているように、それは、今も元気でなければなりません標準コピーコンストラクタ!

+1

'std :: vector'を使ってこの事柄をかなり無意味にするというメモを追加する価値があります。それはあなたのためにすべてのコピーとサイズ変更を行うので、[ゼロの定理](http://en.cppreference.com/w/cpp/language/rule_of_three)に従って、デストラクタを実装しないほうがよいでしょう。コピーコンストラクタ、または代入演算子。 – user4581301

+0

確かに、私は部分的に同意します。つまり、このクラスの役割が生データを管理するだけであれば、std :: vector自体を使用するとすべて解決します。 しかし、ここのコードは単なる単純化されたバージョンであり、自分のメモリを管理したくないと思っています。 – 7raiden7

関連する問題