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