Problem z przeładowaniem operatora przypisania.

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

#include "String.h"

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

String.cpp

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

String.h

#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)

1

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

2
  1. Dlaczego ten operator zwraca wskaźnik?
String* String::operator=(String const&s)

Wg konwencji powinien zwracać String&.

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.

sx = "abc";

ten kod jest równoważny

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*).

0
Patryk27 napisał(a):

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

O, udało się naprawic :)

0
twonek napisał(a):
  1. Dlaczego ten operator zwraca wskaźnik?
String* String::operator=(String const&s)

Wg konwencji powinien zwracać String&.

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.

sx = "abc";

ten kod jest równoważny

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.

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.

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

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

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

// ...

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

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