Operator=

0

Witam. Mam mały problem a mianowicie mam taki kod:

class Obiekt
{...
    public: 
          bool LadujObiekt(string path);

}
 

problem polega w przeciążeniu operatora= tak aby po = przyjmował stringa, spróbowałem go zrobić tak:

Obiekt& operator= (string path)
        {
            this->LadujObiekt(path);
            return *this;
        }; 

Kompilować się kompiluje ale podczas wrzucenia mu stringa wywala error: conversion from 'std::string' to non-scalar type 'Obiekt' requested|

Jest możliwe w ogóle takie przeciążenie operatora?

1

Oczywiście że można przeciążyć a czasami wręcz niezbędne. Nie działa bo coś pochrzaniłeś:

#include <string>
#include <iostream>
using namespace std;

class Obiekt
  {
   public:
   Obiekt() {}
   bool LadujObiekt(string path);
   Obiekt &operator=(string path);
  };

bool Obiekt::LadujObiekt(string path)
  {
   cout<<"LadujObiekt(\""<<path<<"\")"<<endl;
  }

Obiekt &Obiekt::operator=(string path)
  {
   LadujObiekt(path);
   return *this;
  };

int main()
  {
   Obiekt x;
   x="ala ma kota";
   cin.sync();
   cin.get();
   return 0;
  }
1

Szczerze mówiąc nie widzę problemu, ponieważ Twój kod się kompiluje (przeanalizuj sobie):

#include <iostream>

using namespace std;

class Obiekt
{
    public:
          bool LadujObiekt(string path)
           {
            cout << "Sciezka: " << path << endl;
            return true;
           }
          Obiekt& operator= (string path)
           {
            this->LadujObiekt(path);
            return *this;
           }
 };

 int main()
 {
   Obiekt a;
   a = "1234";
   return 0;
 }

widze że zostałem uprzedzony :P

0

Już znalazłem gdzie miałem błąd. Chodziło o to że zamiast zapisu:

Obiekt x;
x="asdf";
 

pisałem

obiekt x="asdf"; 

Wtedy wywalają się takie dziwne błędy.

Ma ktoś może pomysł aby ten pierwszy zapis też działał?

0

Niby rozumiem, ale nic nie rozumiem. W każdym razie dzięki za linka, może kiedyś skorzystam. Chwilowo mi to wystarcza.

1

Wywołanie

Typ obiekt = wartosc;

Powoduje odpalenie konstruktora kopiującego (ponieważ nadajesz wartość w chwili tworzenia obiektu).
operator=() startuje kiedy nadajesz wartość już istniejącemu obiektowi.

0

No dobrze. Zrobiłem konstruktor

Obiekt(){};                                   //aby używać Obiekt a;

oraz

 Obiekt(const string &path)
{
          this->LadujObiekt(path)
};

Gdy są w public to ładnie działa zapis

Obiekt a("path");

ale zapis

Obiekt a="path"; 

juz nie działa.error: conversion from 'const char [5]' to non-scalar type 'Obiekt' requested

Dobrze zrozumiałem że muszę jeszcze przeciążyć new aby działało?

1

Musisz napisać konstruktor kopiujący, który jako argument przyjmuje const char*, bo takiego typu są literały

0

Ok, dopisałem drugi operator= przyjmujący chara oraz konstruktor kopiujący przyjmujący chara i wszystko ładnie śmiga.
Wielkie dzięki za pomoc.

Dawno nie byłem na forum a nie widzę opcji pochwały. Jest gdzieś takowa?

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