When trying to implement these two classes, calling the copy constructor and the = operator gives the "Debug Assertion Failed! _CrtIsValidHeapPointer(block)" error even though the console output is the one expected. I've tried to follow all sorts of advice regarding memory management and checking whether the pointers are valid and whatnot but nothing seemed to work.
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
using namespace std;
class Oras {
private:
string nume;
string tara;
float tempCrt;
int nrLuni;
float* istoricTemp;
public:
Oras() {
this->nume = "nedefinit";
this->tara = "nedefinit";
this->tempCrt = 0;
this->nrLuni = 0;
this->istoricTemp = nullptr;
}
Oras(string nume, string tara, float tempCrt, int nrLuni, float* istoricTemp) {
this->nume = nume;
this->tara = tara;
this->tempCrt = tempCrt;
this->nrLuni = nrLuni;
this->istoricTemp = new float[nrLuni];
for (int i = 0; i < nrLuni; i++)
this->istoricTemp[i] = istoricTemp[i];
}
void afisareOras() {
cout << endl << this->nume << ", oras din " << this->tara << ", are temperatura medie in luna curenta de " << this->tempCrt << " grade Celsius si un istoric al temperaturilor medii in ultimele " << this->nrLuni << " luni de: ";
if(this->istoricTemp != nullptr && this->nrLuni)
for (int i = 0; i < this->nrLuni; i++)
cout << this->istoricTemp[i] << " ";
cout << endl;
}
~Oras() {
cout << endl << "S-a apelat destructorul.";
delete[] this->istoricTemp;
}
};
enum Continent { EUROPA, ASIA, AFRICA, AMERICA_DE_SUD, AMERICA_DE_NORD, OCEANIA };
class Capitala :public Oras {
private:
const bool capitalaUnica;
char* primar = nullptr;
int* istoricPopulatie = nullptr;
int populatieActuala;
int nrAniIstPop;
bool areWaterfront;
float suprafata;
Continent continent = EUROPA;
public:
Capitala():Oras(), capitalaUnica(true) {
this->populatieActuala = 0;
this->nrAniIstPop = 0;
this->areWaterfront = false;
this->suprafata = 0.0f;
}
Capitala(int pop, int nrAni, bool wf, float sup) :capitalaUnica(true), populatieActuala(pop), nrAniIstPop(nrAni), areWaterfront(wf), suprafata(sup), Oras() {
}
Capitala(bool capitalaUnica, const char* primar, Continent continent, int pop, int nrAni, int* istPop, bool wf, float sup, string nume, string tara, float tempCrt, int nrLuni, float* istoricTemp) :capitalaUnica(capitalaUnica), continent(continent), populatieActuala(pop), nrAniIstPop(nrAni), areWaterfront(wf), suprafata(sup), Oras(nume, tara, tempCrt, nrLuni, istoricTemp) {
this->primar = new char[strlen(primar) + 1];
memcpy(this->primar, primar, strlen(primar) + 1);
if (nrAni) {
this->istoricPopulatie = new int[nrAni];
for (int i = 0; i < nrAni; i++)
this->istoricPopulatie[i] = istPop[i];
}
}
Capitala(const Capitala& c) :Oras(c), capitalaUnica(c.capitalaUnica){
this->populatieActuala = c.populatieActuala;
this->nrAniIstPop = c.nrAniIstPop;
this->areWaterfront = c.areWaterfront;
this->suprafata = c.suprafata;
this->continent = c.continent;
if (c.primar) {
this->primar = new char[strlen(c.primar) + 1];
memcpy(this->primar, c.primar, strlen(c.primar) + 1);
}
else {
this->primar = nullptr;
}
if (c.nrAniIstPop && c.istoricPopulatie) {
this->istoricPopulatie = new int[c.nrAniIstPop];
for (int i = 0; i < c.nrAniIstPop; i++)
this->istoricPopulatie[i] = c.istoricPopulatie[i];
}
else {
this->istoricPopulatie = nullptr;
}
}
Capitala& operator= (const Capitala& c) {
if (this != &c) {
Oras::operator=(c);
this->populatieActuala = c.populatieActuala;
this->nrAniIstPop = c.nrAniIstPop;
this->areWaterfront = c.areWaterfront;
this->suprafata = c.suprafata;
this->continent = c.continent;
delete[] this->istoricPopulatie;
delete[] this->primar;
if (c.nrAniIstPop && c.istoricPopulatie) {
this->istoricPopulatie = new int[c.nrAniIstPop];
for (int i = 0; i < c.nrAniIstPop; i++)
this->istoricPopulatie[i] = c.istoricPopulatie[i];
}
else {
this->istoricPopulatie = nullptr;
}
if (c.primar) {
this->primar = new char[strlen(c.primar) + 1];
memcpy(this->primar, c.primar, strlen(c.primar) + 1);
}
else {
this->primar = nullptr;
}
}
return *this;
}
bool operator>(const Capitala& c) {
return this->populatieActuala > c.populatieActuala;
}
int operator[](int p) {
if (p >= 0 && p < this->nrAniIstPop)
return this->istoricPopulatie[p];
else
throw out_of_range("Pozitie in afara istoricului populatiei.");
}
void afisareCapitala() {
this->afisareOras();
cout << "Orasul este capitala, avand o populatie actuala de " << this->populatieActuala << ", o suprafata de " << this->suprafata << " si un istoric al populatiei pe ultimii " << this->nrAniIstPop << " ani de: ";
if(this->nrAniIstPop)
for (int i = 0; i < this->nrAniIstPop; i++)
cout << this->istoricPopulatie[i] << " ";
cout << endl << "Capitala " << (this->capitalaUnica ? "" : "nu ") << "este capitala unica si " << (this->areWaterfront ? "" : "nu ") << "are waterfront. Capitala se afla pe continentul ";
switch (this->continent) {
case 0:
cout << "Europa.";
break;
case 1:
cout << "Asia.";
break;
case 2:
cout << "Africa.";
break;
case 3:
cout << "America de Sud.";
break;
case 4:
cout << "America de Nord.";
break;
case 5:
cout << "Oceania.";
break;
}
cout << endl << "Primarul capitalei este " << this->primar << ".";
}
~Capitala() {
delete[] this->istoricPopulatie;
delete[] this->primar;
}
};
int main() {
Capitala capitala2(false, "Sucitu Cristian", AFRICA, 175, 2, new int[2] {165, 170}, false, 200.75f, "Johannesburg", "Africa de Sud", 17.5f, 4, new float[4] {17.4f, 17.0f, 16.9f, 16.5f});
capitala2.afisareCapitala();
cout << endl;
Capitala capitala3(capitala2);
capitala3.afisareCapitala();
cout << endl;
Capitala capitala4;
capitala4 = capitala2;
capitala4.afisareCapitala();
return 0;
}