inicjalizacja pola o nie-domyslnym konstruktorze

0

Cześć! :-) Piszę właśnie program, który wykorzystuje dwie klasy (jedną główną o nazwie Szereg i pomocniczą o nazwie Wyraz). Mam problem z zdefiniowaniem konstruktora klasy Szereg, którego składowa odnosi się do typu klasy Wyraz. A oto kod:

// .....
class Szereg;

class Wyraz
{
  friend class Szereg;
  private:
    int czas;
    double wartosc;
  public:
    Wyraz (int _czas, double _wartosc)
      { czas = _czas; wartosc = _wartosc; }
    void wypisz () {
      cout << "(" << czas << ", " << wartosc << ")" << endl; }    
};

class Szereg
{
  private:
    Wyraz element;
  public:
    Szereg (Wyraz _element) // <--- TUTAJ POJAWIA SIĘ BŁĄD KOMPILACJI
    {
      //element = _element;
      element.czas = _element.czas; 
      element.wartosc = _element.wartosc;
    }
}; 
// ......ciąg dalszy programu .....

Program wywala się w tej linijce (przy definicji konstruktora klasy Szereg):
Szereg (Wyraz _element)

Konstruktor klasy Szereg ma "robić" pierwszy element klasy Szereg ;-) wykorzystując klasę pomocniczą Wyraz.

Ma ktoś pomysł na zdefiniowanie tego konstruktora? Proszę o pomoc i dziękuję z góry :) :-)

blad z kompilatora brzmi:

"In constructor no matching function for candidates are: "
(używam Dev-C++)

0
ddlp napisał(a)
class Wyraz
{
...
    Wyraz (int _czas, double _wartosc)  //A
...
};

class Szereg
{
..
    Szereg (Wyraz _element) //B
..
}; 

zdefiniowales w klasie Wyraz jakikolwiek konstruktor, wiec kompilator nie wygenerowal domyslnych. W klasie Szereg pobierasz Wyraz przez wartosc, a wiec kompilator szuka w Wyrazie copyconstructora -- ktory nie istnieje, patrz zdanie poprzednie. Masz do wyboru:

  • dopisac cctora z palca Wyraz::Wyraz(Wyraz const& other){czas=other.czas;wartosc=other.wartosc;}
  • pobrac nie przez wartosc, tylko przez const-ref Szereg(Wyraz const& _element)
0
quetzalcoatl napisał(a)

zdefiniowales w klasie Wyraz jakikolwiek konstruktor, wiec kompilator nie wygenerowal domyslnych. W klasie Szereg pobierasz Wyraz przez wartosc, a wiec kompilator szuka w Wyrazie copyconstructora -- ktory nie istnieje, patrz zdanie poprzednie. Masz do wyboru:

  • dopisac cctora z palca Wyraz::Wyraz(Wyraz const& other){czas=other.czas;wartosc=other.wartosc;}
  • pobrac nie przez wartosc, tylko przez const-ref Szereg(Wyraz const& _element)

Prawie dobrze! Copyconstructor tworzony jest automatycznie niezależnie, czy istnieją czy nie inne konstruktory. Jemu brakuje domyślnego konstruktora bo w konstruktorze klasy Szereg nie pojawia się lista inicjalizacji więc dla składowej tej klasy poszukiwany jest domyślny konstruktor.
Powinien to poprawić tak:

class Szereg
{
  private:
    Wyraz element;
  public:
    Szereg (Wyraz & _element): element(_element)
    { }
}; 

referencja w argumencie konstruktora nie jest obowiązkowa, ale zalecana ze względy na optymalizację.

//q: true.. zauwazylem arg-przez-kopie i niedoczytalem kodu 'do konca'

0

dzięki Marku :)

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