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

當兩個析構函數試圖「刪除[]」它們時,從另一個'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"; 
     } 
    } 

我沒有編譯/測試,但它應該是罰款現在,作爲存儲器管理是通過做std拷貝構造函數!

+1

值得注意的是,使用'std :: vector'使得這件事變得毫無意義。它會爲你做所有的複製和調整大小,所以根據[Rule of Zero](http://en.cppreference.com/w/cpp/language/rule_of_three),你最好不要實現析構函數,複製構造函數,或者賦值操作符。 – user4581301

+0

當然,我部分同意,也就是說,如果這個類的角色只是管理原始數據,那麼使用std :: vector本身就可以解決所有問題。 但是,如果這裏的代碼只是一個簡化版本,並且不想管理自己的內存,那麼我認爲它很好! – 7raiden7