• 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"

VPS Starter Arubacloud
0 głosów
239 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 (154,780 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,000 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 (154,780 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ź 101 wizyt
pytanie zadane 22 października 2018 w JavaScript przez Biay Początkujący (420 p.)
0 głosów
1 odpowiedź 142 wizyt
pytanie zadane 27 czerwca 2018 w C i C++ przez 99xkubax99 Obywatel (1,780 p.)
0 głosów
1 odpowiedź 227 wizyt

92,455 zapytań

141,263 odpowiedzi

319,099 komentarzy

61,854 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.

Akademia Sekuraka

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...