• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Błąd "Only constructor take members initializers"

Cloud VPS
0 głosów
347 wizyt
pytanie zadane 26 kwietnia 2020 w C i C++ przez amtrax Dyskutant (9,630 p.)
edycja 26 kwietnia 2020 przez amtrax

Cześć, 

kolejny dzień zmagań z dziedziczeniem wielokrotnym. 

Mam 4 klasy w tym jedną wirtualną. W każdej klasie są odpowiednie konstruktory. W ostatniej, która wirtualnie dziedziczy po 2, jest również konstruktor domyślny. Przy nim program pokazuje błąd: "Only constructor take members initializers".  

Jak naprawić kod żeby program działał i w funkcji main można było stworzyć obiekt bez podania żadnych argumentów? 

 

Podałem wszystkie wymagane z ćwiczenia konstruktory.  Konstruktor wirtualny jest zdefiniowany w osobnym pliku, razem z resztą metod, których tu nie zamieściłem.

Problem pojawia się w tej linijce: 

highfnik() : abstr_emp(),manager(),fink() {};

Tu cały kod. 

#ifndef CLASS_H_INCLUDED
#define CLASS_H_INCLUDED
#include <string>
#include <iostream>
class abstr_emp
{
private:
    std::string fname;
    std::string lname;
    std::string job;
public:

    abstr_emp():fname("default"),lname("default"),job("default") {};
    abstr_emp(const std::string & fn, const std::string & ln, const std::string & j):
        fname(fn),lname(ln),job(j) {};
    virtual ~abstr_emp() = 0;
[...]
};
class employee : public abstr_emp
{
public:
    employee(): abstr_emp() {};
    employee(const std::string & fn,const std::string & ln, const std::string & j):abstr_emp(fn,ln,j) {};
   [....]
};

class manager : virtual public abstr_emp
{
private:
    int inchargeof;

public:
    manager(): abstr_emp() ,inchargeof(0) {};
    manager(const std::string & fn,const std::string & ln,
            const std::string & j, int ico = 0):abstr_emp(fn,ln,j),inchargeof(ico) {};
    manager(const abstr_emp & e, int ico):abstr_emp(e),inchargeof(ico) {};
    manager(const manager & m):abstr_emp(m) {};
    [....]
};
class fink : virtual public abstr_emp
{
private:
    std::string reportsto;

public:
    fink():abstr_emp(), reportsto("default") {}
    fink(const std::string & fn,const std::string & ln, const std::string & j, const std::string & rpo):
        abstr_emp(fn,ln,j),reportsto(rpo) {};
    fink(const abstr_emp & e, const std::string & rpo): abstr_emp(e),reportsto(rpo) {};
    fink (const fink & e):abstr_emp(e) {};
    [....]
};
class highfink : public manager, public fink
{
public:
    highfnik() : abstr_emp(),manager(),fink() {};  // tutaj wystepuje błąd 
    highfink(const std::string & fn,const std::string & ln, const std::string & j,
             const std::string & rpo,int ico):
        abstr_emp(fn,ln,j),fink(fn,ln,j,rpo),manager(fn,ln,j,ico) {};
    highfink(const abstr_emp & e,const std::string & rpo,int ico):
        abstr_emp(e),fink(e,rpo),manager(e,ico) {};
    highfink(const fink & f, int ico): abstr_emp(f),manager(f,ico),fink(f) {}
    highfink(const manager & m,const std::string & rpo): abstr_emp(m),manager(m),fink(m,rpo) {};
    highfink(const highfink & h):abstr_emp(h),fink(h),manager(h) {};
    [....]
};

#endif // CLASS_H_INCLUDED

 

1 odpowiedź

0 głosów
odpowiedź 26 kwietnia 2020 przez tangarr Mędrzec (155,180 p.)
wybrane 26 kwietnia 2020 przez amtrax
 
Najlepsza

Klasa highfink nie dziedziczy bezpośrednio po abstr_emp.

highfnik() : manager(), fink() {};

tak naprawdę w ogóle nie potrzebujesz wywoływać konstruktorów klas bazowych jeżeli nie przekazujesz do nich żadnych argumentów

komentarz 26 kwietnia 2020 przez tkz Nałogowiec (42,040 p.)
Co w ogólnym rozrachunku za dużo nie zmieni, bo i tak zostaną wywołane przy inicjalizowaniu klasy pochodnej. Sam zamysł na klasy i ich ułożenie jest beznadziejny w mojej opinii.
komentarz 26 kwietnia 2020 przez amtrax Dyskutant (9,630 p.)

@tangarr,

Dziękuje za odpowiedź,

jednak gdy usunę konstruktory klasy abstr_emp, nadal błąd pozostaje. Jeżeli zostawię tylko konstruktor highfink(), kompilator pokazuje następujący błąd przy instrukcji: 
 

highfink a;

występuje błąd: 

no matching function for ccall to 'highfink::highfink()'

 

komentarz 26 kwietnia 2020 przez tangarr Mędrzec (155,180 p.)
Wrzuciłem ten kod do edytora i od razu znalazłem błąd.

Masz literówkę w nazwie konstruktora highfnik zamiast highfnik :D
komentarz 26 kwietnia 2020 przez amtrax Dyskutant (9,630 p.)
Faktycznie...

Dziękuję za odpowiedzi i pomoc w rozwiązaniu problemu

 

Pozdrowienia

Podobne pytania

0 głosów
1 odpowiedź 162 wizyt
pytanie zadane 22 października 2018 w JavaScript przez Biay Początkujący (420 p.)
0 głosów
1 odpowiedź 281 wizyt
pytanie zadane 27 czerwca 2018 w C i C++ przez 99xkubax99 Obywatel (1,780 p.)
0 głosów
1 odpowiedź 317 wizyt

93,487 zapytań

142,423 odpowiedzi

322,773 komentarzy

62,908 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj

Kursy INF.02 i INF.03
...