Przerobienie operatora przypisania z c++ na c#.

0
#include <iostream>
using namespace std;
enum kolor {czarny,czerwony,niebieski,bialy};
 
class pojazd
{
protected:
    int ilosc_kol;
public:
    pojazd(int ile) : ilosc_kol(ile) {}
    pojazd(const pojazd &);
    pojazd & operator=(const pojazd & wz);
};
 
class automobil : public pojazd
{
    int stan_licznika;
    kolor kolor_karoserii;
public:
    automobil(int kola, kolor k, int licznik) : pojazd(kola)
    {
        stan_licznika = licznik;
        kolor_karoserii = k;
    }
    automobil(const automobil &);
    automobil & operator=(const automobil &ww);
    friend ostream & operator <<(ostream & ekran, const automobil & obj);
};
 
pojazd::pojazd(const pojazd & wzor)
{
    ilosc_kol = wzor.ilosc_kol;
}
 
automobil::automobil(const automobil & wzorzec) : pojazd(wzorzec)
{
    stan_licznika = 0;
    kolor_karoserii = wzorzec.kolor_karoserii;
}
 
pojazd & pojazd::operator=(const pojazd & wz)
{
    ilosc_kol = wz.ilosc_kol;
    return *this;
}
 
automobil & automobil::operator=(const automobil & wzor)
{
    // 1 sposob:
    (*this).pojazd::operator=(wzor);
 
    // 2 sposob:
    pojazd *wskpojazd = this;
    (*wskpojazd) = wzor;
 
    // 3 sposob:
    pojazd & refpojazd = *this;
    refpojazd = wzor;
 
    // dalsza czesc operatora przypisania
    kolor_karoserii = wzor.kolor_karoserii;
    stan_licznika = wzor.stan_licznika + 2;
    return *this;
}
 
ostream & operator<<(ostream & ekran, const automobil & obj)
{
    ekran << " Liczba kol " << obj.ilosc_kol
          << ", Licznika " << obj.stan_licznika
          << ", kolor nr"  << obj.kolor_karoserii << endl;
          return ekran;
} 

Pomijam przerabianie reszty programu na c#.
Ten fragment w c++:

automobil & automobil::operator=(const automobil & wzor)
{
    // 1 sposob:
    (*this).pojazd::operator=(wzor);
 
    // 2 sposob:
    pojazd *wskpojazd = this;
    (*wskpojazd) = wzor;
 
    // 3 sposob:
    pojazd & refpojazd = *this;
    refpojazd = wzor;
 
    // dalsza czesc operatora przypisania
    kolor_karoserii = wzor.kolor_karoserii;
    stan_licznika = wzor.stan_licznika + 2;
    return *this;
} 

w c# by wyglądał tak ?:

automobil & automobil::operator=(const automobil & wzor)
{
    // 1 sposob:
    this.pojazd::operator=(wzor);
 
    // 2 sposob:
    pojazd wskpojazd = this;
    wskpojazd = wzor;
 
 
    // dalsza czesc operatora przypisania
    kolor_karoserii = wzor.kolor_karoserii;
    stan_licznika = wzor.stan_licznika + 2;
    return *this;
} 

i tylko 2 sposoby zapisu, ponieważ w c# nie ma wskaźników.

I jeszcze takie pytanie, mam przeciążony operator <<, którego funkcja jest zaprzyjaźniona z klasą automobil. Jak ten operator przeładować w c#, jeśli składniki klasy automobil byłyby prywatne ?

1

w C# by nie wyglądał wcale, bo nie ma ani nie ma potrzeby robienia operatorów przypisania w C#.

0

Możesz wyjaśnić czemu ? W języku c# nie ma operatora przypisania ? To co go zastępuje ?

1

Nic go nie zastępuje, bo C# nie ma takiej obsesji na punkcie kopiowania obiektów jak C++.

Poczytaj o różnicy między typami referencyjnymi (reference types) a wartościowymi (value types) w C#.

Do kopiowania obiektów istnieje metoda MemberwiseClone, jest też interfejs ICloneable - ale są rzadko potrzebne do czegokolwiek.

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