• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

zwracanie obiektu w przeciążonych operatorach +

Object Storage Arubacloud
0 głosów
150 wizyt
pytanie zadane 6 maja 2017 w C i C++ przez Zuczek991 Nowicjusz (230 p.)

Witam.
Czemu moje operatory + nie chcą zwracać obiektu utworzonego w ich ciele ? Debugger przechodzi przez wszystkie linie tych metod a program sypie się przy próbie zwrócenia obiektu.

Stringw  Stringw::operator+(const Stringw &st)
{
	 Stringw sum;
	sum.str = new char[len + st.len +1];
	strcpy(sum.str, str);
	strcat(sum.str, st.str);
	sum.len = len + st.len;
	return sum;
}
//ta funkcja jest zaprzyjaźniona z klasą
Stringw operator+( const char*s, const Stringw &st)
{
	 Stringw sum;
	sum.str = new char[strlen(s) + st.len + 1];
	strcpy(sum.str, s);
	strcat(sum.str, st.str);
	sum.len = strlen(s) + st.len;
	return sum;
}

Stringw Stringw::operator+(const char* s)
{
	 Stringw sum;
	sum.str = new char[len + strlen(s) + 1];
	sum.len = len + strlen(s);
	strcpy(sum.str, str);
	strcat(sum.str,s);
	return sum;

}

 

komentarz 6 maja 2017 przez Dexterim Dyskutant (8,370 p.)
Co masz na myśli sypie się wywala błąd? Jaki komunikat dostajesz?
komentarz 6 maja 2017 przez Zuczek991 Nowicjusz (230 p.)
Dokładnie coś takiego

Unhandled exception at 0x000007FED5BDFD0E (ucrtbased.dll) in ConsoleApplication1.exe: 0xC0000005: Access violation reading location 0xFFFFFFFFFFFFFFFF.
komentarz 6 maja 2017 przez adrian17 Ekspert (345,160 p.)
Pokaż wszystkie metody klasy.
komentarz 6 maja 2017 przez Zuczek991 Nowicjusz (230 p.)
Stringw::Stringw()
{
	str = new char[1];
	str[0] = '\0';
	len = 0;
}

Stringw::Stringw(const char *s)
{
	delete[] str;
	len = strlen(s);
	str = new char[len+1];
	strcpy(str, s);
}

Stringw::Stringw(const Stringw &s)
{	
	delete[] str;
	len = s.len;
	str = new char[len + 1];
	strcpy(str, s.str);
}

Stringw::~Stringw()
{
	delete[] str;
}

Stringw & Stringw::operator=(const Stringw &s)
{
	if (this == &s)
		return *this;
	delete[] str;
	len = s.len;
	str = new char[len + 1];
	strcpy(str, s.str);
	return *this;
}

Stringw & Stringw::operator=(const char * s)
{
	if (this->str == s)
		return *this;
	delete[] str;
	len = strlen(s);
	str = new char[len + 1];
	strcpy(str, s);
	return *this;
}
Stringw  Stringw::operator+(const Stringw &st)
{
	 Stringw sum;
	 
	sum.str = new char[len + st.len +1];
	strcpy(sum.str, str);
	strcat(sum.str, st.str);
	sum.len = len + st.len;
	return sum;
}


void Stringw::stringlow()
{
	for (int i = 0;i < len;i++)
	{
		str[i]=tolower(str[i]);
	}
}

void Stringw::stringup()
{
	for (int i = 0;i < len;i++)
	{
		str[i]=toupper(str[i]);
	}
}

int Stringw::count(char s)
{
	int x = 0;
	for (int i = 0;i < len;i++)
	{
		if (str[i] == s)
			x++;
	}
	return x;
}

const char & Stringw::operator[](int i) const
{
	return str[i];
}

char & Stringw::operator[](int i)
{
	return str[i];
}

bool operator<(const Stringw &st, const Stringw &st2)
{
	return(std::strcmp(st.str, st2.str) < 0);
}

bool operator>(const Stringw &st, const Stringw &st2)
{
	return st2 < st;
}

bool operator==(const Stringw &st, const Stringw &st2)
{
	return (std::strcmp(st.str, st2.str) == 0);
}

ostream & operator<<(ostream &os, const Stringw &st)
{
	os << st.str;
	return os;
}

istream & operator >> (istream & is, Stringw & st)
{
	char temp[Stringw::CINLIM];
	is.get(temp,Stringw::CINLIM);

	if(is)
		st = temp;
	while (is && (is.get() != '\n'))
		continue;
	return is;
}

Stringw Stringw::operator+(const char* s)
{
	 Stringw sum;
	 
	sum.str = new char[len + strlen(s) + 1];
	sum.len = len + strlen(s);
	strcpy(sum.str, str);
	strcat(sum.str,s);
	return sum;

}
Stringw operator+( const char*s, const Stringw &st)
{
	 Stringw sum;
	
	sum.str = new char[strlen(s) + st.len + 1];
	strcpy(sum.str, s);
	strcat(sum.str, st.str);
	sum.len = strlen(s) + st.len;
	return sum;
}

 

komentarz 6 maja 2017 przez adrian17 Ekspert (345,160 p.)
Przede wszystkim to w konstruktorach masz nadmiarowe delete[] na wskaźniku, który nie ma żadnej konkretnej wartości. (debugger powinien na to wskazać :/ )
komentarz 6 maja 2017 przez Zuczek991 Nowicjusz (230 p.)
Wcześniej tego nie było, poprostu dużo kombinowałem sam i próbowałem różnych sposobów, bez tych delete jest dokładnie taki sam komunikat :/
komentarz 6 maja 2017 przez Zuczek991 Nowicjusz (230 p.)
A nie, przepraszam, po usunięciu delete działa, być może problem był jak nie dodawałem len w operatorach ponieważ przedtem nie dodawałem ich do siebie w przeciązeniu, dziękuje za pomoc :)

3 odpowiedzi

+1 głos
odpowiedź 6 maja 2017 przez j23 Mędrzec (194,920 p.)
Dodaj konstruktor kopiujący i operator przypisania, żeby było do pary...
komentarz 7 maja 2017 przez Arkadiusz Sikorski Pasjonat (20,160 p.)
Fakt, jeżeli używane są operatory i dynamiczna alokacja, to byłoby dobrze od razu dodać konstruktor kopiujący i operator przypisania, bo inaczej można się dorobić wielu kłopotów.
0 głosów
odpowiedź 6 maja 2017 przez Evelek Nałogowiec (28,960 p.)
Na pierwszy rzut oka to mi brakuje delete [] str przed alokacją pamięci dla nowego obiektu.
–1 głos
odpowiedź 7 maja 2017 przez Gankkah Użytkownik (720 p.)
Wydaje mi się że zapomniałeś o gwiazdzce.

Podobne pytania

0 głosów
1 odpowiedź 331 wizyt
+1 głos
1 odpowiedź 279 wizyt
pytanie zadane 5 marca 2022 w Java przez `Krzychuu Stary wyjadacz (13,940 p.)
0 głosów
0 odpowiedzi 125 wizyt

92,620 zapytań

141,474 odpowiedzi

319,813 komentarzy

62,003 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...