Problem z przeładowaniem operatora przypisania.

Problem z przeładowaniem operatora przypisania.
mistrzuniu1
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 51
0

Pisze klasę String, nie mogę używać klasy string ze standardowej bibilioteki.
Chciałbym tak przeładować operator przypisania, by moc dopisywać znaki w ten sposób

Kopiuj
#include "String.h"

int main()
{
	String sx;
	sx = "abc";
	return 0;
}

String.cpp

Kopiuj
String* String::operator=(String const&s)
{
	this->napis = s.napis;
	return this;
}

String.h

Kopiuj
#pragma once
	class String
	{
	public:
		char* napis;
		String* operator=(String const&);
		String();
		~String();
	};

Przy takiej próbie, wyskakuje taki błąd:

Error C2679 binary '=': no operator found which takes a right-hand operand of type 'const char [4]' (or there is no acceptable conversion)

Patryk27
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Wrocław
  • Postów: 13042
1

Przecież masz w komunikacie dokładnie napisane o co chodzi ;)

twonek
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 2500
2
  1. Dlaczego ten operator zwraca wskaźnik?
Kopiuj
String* String::operator=(String const&s)

Wg konwencji powinien zwracać String&.

Kopiuj
this->napis = s.napis;

to jest kopiowanie wskaźnika, czyli po tym oba obiekty będą wskazywać na ten sam "ciąg znaków". To co musisz zrobić to zarezerwować pamięć i skopiować znaki z s do własnego bufora.

Kopiuj
sx = "abc";

ten kod jest równoważny

Kopiuj
sx.operator=("abc");

a przecież nie masz żadnego operatora, który by przyjmował literał znakowy. Rozwiązaniem może być np. konstruktor String(const char*).

mistrzuniu1
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 51
0
Patryk27 napisał(a):

Przecież masz w komunikacie dokładnie napisane o co chodzi ;)

O, udało się naprawic :)

mistrzuniu1
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 51
0
twonek napisał(a):
  1. Dlaczego ten operator zwraca wskaźnik?
Kopiuj
String* String::operator=(String const&s)

Wg konwencji powinien zwracać String&.

Kopiuj
this->napis = s.napis;

to jest kopiowanie wskaźnika, czyli po tym oba obiekty będą wskazywać na ten sam "ciąg znaków". To co musisz zrobić to zarezerwować pamięć i skopiować znaki z s do własnego bufora.

Kopiuj
sx = "abc";

ten kod jest równoważny

Kopiuj
sx.operator=("abc");

a przecież nie masz żadnego operatora, który by przyjmował literał znakowy. Rozwiązaniem może być np. konstruktor String(const char*).

Dzięki za zwrócenie uwagi na to kopiowanie wskaznika.

WY
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 134
0

Poza tym w twoim kodzie przeciążenia tego operatora jako parametr przyjmujesz referencję do obiektu twojej klasy String po czym zamiast przekazać takowy obiekt, przekazujesz ciąg znaków. Poniższy kod powinien działać chociaż nie sprawdzałem.

Kopiuj
String& String::operator=(const string napis) {
    this->napis = napis;
    return this;
}

Natomiast, żeby twój kod zadziałał musiałbyś zrobić coś takiego:

Kopiuj
String& String::operator=(const String& s) {
    this->napis = s.napis;
    return this;
}

// ...

int main() 
{
    String s1("abc");
    String s2 = s1;
  
     // ...
    return 0;
}

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.