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

Przeciążenie operatora+ łączenie dwóch łańcuchów

VPS Starter Arubacloud
0 głosów
598 wizyt
pytanie zadane 3 listopada 2018 w C i C++ przez Sic Dyskutant (8,510 p.)
edycja 3 listopada 2018 przez Sic

Witam w zadaniu miałem stworzyć przeciążenie operatora+, który ma połączyć ze sobą dwa łańcuchy. Wykorzystałem do tego funkcje strncat() i tu pojawia się moje pytanie, ponieważ zrobiłem wszystko zgodnie z dokumentem funkcji a jednak pojawia się błąd: "wartość początkowa odwołania do wartości niebędącej stała musi być l-wartością". Próbowałem również wykorzystać funkcję strcat(), jednak pojawia się ten sam błąd, proszę o podpowiedź.

String & String::operator+(const String & plus) //przeciążenie operatora+
{
	return strncat(str, plus.str, std::strlen(str));
}

 

komentarz 3 listopada 2018 przez adrian17 Ekspert (344,100 p.)
Pokażesz więcej kodu, definicję klasy? Bo bez kontekstu to ogólnie nie wydaje się mieć sensu.
komentarz 3 listopada 2018 przez RafalS VIP (122,820 p.)
Obawiam sie, że zwracanie referencji do obiektu tymczasowego nigdy nie bedzie mialo sensu :D
komentarz 3 listopada 2018 przez adrian17 Ekspert (344,100 p.)
(fakt, natomiast strncat też wygląda dość podejrzanie sam z siebie)
komentarz 3 listopada 2018 przez j23 Mędrzec (194,920 p.)
Implementacja tego operatora jest bez sensu (i jest błędna).

1 odpowiedź

0 głosów
odpowiedź 3 listopada 2018 przez RafalS VIP (122,820 p.)

Troszke nagmatwałeś.

Sam błąd oznacza, że nie możesz zainicjować referencji niestałą r-wartoscia:

//blad kompilacji
String& s = String();
//wszystko cacy
const String& s2 = String();

r-wartość w tym przypadku to coś ulotnego co w normalnych warunkach przestaje istnieć w kolejnej linijce. Łapiąc ją przy pomocy referencji możesz przedłużyć jej życie, ale na modyfikowanie tego ulotnego obiektu jezyk juz nie pozwala.

Ale moment? Skąd u Ciebie rwartosci?

strncat zwraca char * a Twoja funkcja deklaruje zwracanie String& co powoduje, że tak na prawde zwracasz:

    return String(strncat(str, plus.str, std::strlen(str)));

o ile istnieje konstruktor String(char *).

Żeby umożliwić łańcuchy możesz zwrócić obiekt przez wartość. Bo tak powinien działać operator +. Zwracać nowy obiekt a nie modyfikowac operandy:

string s1 = "paprykarz";
string s2 = "szczecinski ";
string s3 = s1 + s2;
//spodziewasz sie, ze
s1 == "paprykarz" && s2 == "szczecinski " && s3 == "paprykarz szczecinski"
//a w tym momencie s3 co prawda bedzie sie zgadzac ale s2 tez bedzie zmodyfikowane
komentarz 3 listopada 2018 przez RafalS VIP (122,820 p.)
Nic nie musisz zaprzyjaźniać.
komentarz 4 listopada 2018 przez Sic Dyskutant (8,510 p.)
To już nie wiem o co chodzi.
komentarz 4 listopada 2018 przez RafalS VIP (122,820 p.)
Generalnie nie musisz, ale teraz zauważyłem że nie dobierzesz się do str, wiec jednak przyjazn
komentarz 4 listopada 2018 przez Sic Dyskutant (8,510 p.)

To swoją drogą, w dodatku zorientowałem się że są potrzebne zdefiniowane dwa różne przeciążenie tego operatora.

#1 wywołanie w pliku 'main'

s2 = s2 + s1;

a tutaj jego definicja (działa poprawnie)

String & String::operator+(const String & plus) //przeciążenie operatora+
{
	String object = strcat(str, plus.str); //strcat() łączy ze sobą dwa łańcuchy
	return object;
}

#2 z tym mam problem nie mogę dobrać odpowiedniej definicji

s2 = "Mam na imie " + s3; //przeciążenie operatora = i +
String & operator+(char * sign, const String & plus)
{
	String object = strcat(sign, plus.str);
	return object;

}

Próbowałem definiować też z argumentem "const char*" jednak za każdym razem był błąd. Zamiast korzystać z funkcji strcat() lub strncat() starałem się zwyczajnie je połączyć niestety wszystko próby okazały się niepowodzeniem.

komentarz 18 marca 2019 przez Poczatkujacy127 Nowicjusz (120 p.)

Robię bardzo podobnie i mam identyczny problem.

Próbuję jeszcze tak (to jest funkcja zaprzyjaźniona, potrzebna aby połączyć "Mam na imię... " z obiektem s3. 

String operator + (const char *c,  String &s)
 {

    String temp;
    temp.len = strlen(c) + s.len;
    temp.str = new char[temp.len + 1];
    strcpy(temp.str, c);
    strcat(temp.str, s.str);
    return temp;



 }

Program się kompiluje, ale za wpisanym imieniem wyskakują śmieci i dalej sie sypie. 
Czy komuś się w ogóle udało zrobić to zadanie? Szukam od 3 dni i nie mogę znaleźć, chyba się poddam. 

Podobne pytania

0 głosów
1 odpowiedź 232 wizyt
+1 głos
1 odpowiedź 536 wizyt
pytanie zadane 19 czerwca 2021 w C i C++ przez wndtcw Nowicjusz (130 p.)
+1 głos
2 odpowiedzi 293 wizyt
pytanie zadane 14 czerwca 2021 w C# przez everstudybee Użytkownik (610 p.)

92,453 zapytań

141,262 odpowiedzi

319,088 komentarzy

61,854 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

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 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!

...