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'에서 포인터를 복사하는 것은 두 소멸자가'delete []'를 시도 할 때 틀리게 틀립니다. 같은 포인터를 두 번 삭제하면됩니다. –

답변

0

은 코멘트를, 나는 얼마나 깊은 사본을 수행하는 방법을 보여 드리겠습니다.

또한, 간단하게하기 위해, 나는 표준 : : 벡터 사용할 것이다

#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