Problem z "operator=" w klasie pochodnej z *char

0

Witam mam problem z metodą kopiowania klasy pochodnej w poniższym kodzie

Cd- klasa bazowa
Classic - klasa pochodna
w załączniku kod programu, z góry dzięki za pomoc
Pozdrawiam
Krzysiek

Cd & Cd::operator=(const Cd & d)
{
	if (&d == this)
		return *this;
	strcpy_s(performers, strlen(d.performers)+1, d.performers);
	strcpy_s(label, strlen(d.label)+1, d.label);
	selections = d.selections;
	playtime = d.playtime;
	return *this;
}
//metody klasy Classic

Classic & Classic::operator=(const Classic & c)
{
	if (&c == this)
		return *this;
	Cd::operator=(c);
	delete [] main_record;                     **<--- w tym miejscu przerywa się progra```
	main_record = new char[strlen(c.main_record) + 1];
	strcpy_s(main_record, strlen(main_record)+1, c.main_record);
	return *this;
0

Nigdzie w Twoim kodzie nie widzę definicji / deklaracji main_record, to na początek.

Edit: teraz już jest ;-p

0

To jest plik .cpp wszystkie definicje są w .h
program jest w załączniku

Patryk27 napisał(a):

Nigdzie w Twoim kodzie nie widzę definicji / deklaracji main_record, to na początek.

2

Język w którym piszesz to nie C++, to C z klasami.

0

Szczerze nie wiem co wnosi twoja uwaga do mojego pytania, ale może mi wyjaśnisz.
To jest zadanie z książki "Język C++" Stephena Prata z działu klasy i dziedziczenie.

Pijak napisał(a):

Język w którym piszesz to nie C++, to C z klasami.

0

Robisz jakieś cuda na kiju w tych operatorach, a dokładnie w w strcpy_s:

Cd& Cd::operator =(const Cd& d)
{
    if (this == &d) return *this;

    std::strcpy(performers, d.performers);
    std::strcpy(label, d.label);
    selections = d.selections;
    playtime = d.playtime;
    return *this;
}

Classic& Classic::operator =(const Classic& c)
{
    if (this == &c) return *this;

    Cd::operator =(c);
    delete [] mainName;
    mainName = new char[std::strlen(c.mainName) + 1];
    std::strcpy(mainName, c.mainName);
    return *this;
}
2

Cały problem polega na tym, że mieszasz C++ z C.
Jeśli byś zrezygnował z C-stringów i użył std::string to rule of zero załatwiłaby za ciebie wszystko.

Nie wiem, skąd ta powszechna mania używania C w kodzie C++, widzę to nawet u ludzi pracujących wiele lat w zawodzie.
W końcu pisanie czystego C++ jest łatwiejsze i wcale nie odbija się negatywnie na wydajności.

0

Dziękuję wszystkim za pochylenie się nad problemem, doradzenie paru rzeczy i polecenie książek
Pozdrawiam,
Krisga

Problem polegał na podwójnym wywołaniu destruktora klasy bazowej

1 użytkowników online, w tym zalogowanych: 0, gości: 1