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

Dziedziczenie wielokrotne + wielopokoleniowe

Object Storage Arubacloud
0 głosów
987 wizyt
pytanie zadane 17 stycznia 2017 w C i C++ przez alchem Obywatel (1,210 p.)

Hej mam kod odnośnie klas:

podatnik,hpp
 

class Podatnik
{
    std::string nip_;
public:
    Podatnik(std::string nip_)
    :nip_(nip_)
    {
       //sprawdzamy czy to nip, jak nie mo¿emy poprosiæ o nowe dane podanie albo coœ....
    }
    virtual ~Podatnik(void) = default;
    auto Nip(void)const ->std::string {return nip_;}
    auto pokaz(void) const -> std::string { return "nip: " + nip_;}
    virtual auto wizytowka(void) const ->std::string {return nip_;}

};

Osoba_fizczyna.hpp

class Osoba_fizyczna: public Podatnik
{
   std::string imie_;
   std::string nazwisko_;
   std::string data_;
public:
    Osoba_fizyczna(std::string imie, std::string nazwisko, std::string nip, std::string data)
    :Podatnik(nip) , imie_(imie), nazwisko_(nazwisko),data_(data){}


    auto Imie(void)      const -> std::string {return imie_;}
    auto Nazwisko(void)  const -> std::string {return nazwisko_;}
    auto Data(void)      const -> std::string {return data_;}
    auto pokaz(void)     const -> std::string{ return  Imie()+ " " + Nazwisko()+ Data() +" nip: " + Nip();}
    auto wizytowka(void) const ->std::string override {return  Imie()+ " " + Nazwisko()+" "+Data() + "\n "+" nip: " + Nip()+ "\n "+ "\n ";}
    
};

Firma.hpp

class Firma: public Podatnik
{

    std::string nazwa_firmy_;
public:
    Firma(std::string nazwa_firmy, std::string nip)
    :Podatnik(nip), nazwa_firmy_(nazwa_firmy){}

    auto firma(void) const -> std::string {return nazwa_firmy_;}
    auto pokaz(void) const -> std::string{ return firma()+ "nip: "+ Nip();}
    auto wizytowka()const ->std::string override {return firma()+ "\n " + " nip: "+ Nip()+ "\n "+ "\n ";}

};

dzialalnosc.hpp

class Dzialalnosc: public Osoba_fizyczna, public Firma
{
  std::string regon_;
  public:
      auto REG(void) const -> std::string {return regon_;}

      Dzialalnosc(std::string imie, std::string nazwisko, std::string nip, std::string data, std::string nazwa_firmy, std::string regon)
      :Firma(nazwa_firmy, nip),Osoba_fizyczna(imie, nazwisko, nip, data) ,regon_(regon){}

      auto wizytowka(void) const ->std::string override {return  Imie()+ " " + Nazwisko()+" "+Data() + "\n "+" nip: " + Nip()+ "\n "+ firma()+ "Regon: " +REG()+"\n ";}

};

Próbując skompilować kod dostaję błąd w klasie działalnośc,hpp (8 linia kodu)

class "Dzialalnosc" does not have any field named "Firma"
Nie mogę znaleźć tego co robię źle, wie ktoś co jest nie tak?

 

1 odpowiedź

0 głosów
odpowiedź 17 stycznia 2017 przez criss Mędrzec (172,590 p.)
wybrane 17 stycznia 2017 przez alchem
 
Najlepsza
To jest jedyny błąd? Jeśli nie - podaj wszystkie.

Kilka uwag:

Firma i Osoba_fizyczna powinny dziedziczyć po Podatnik wirtualnie. A to z powodu, że Dzialalnosc dziedziczy po obu tych klasach, więc ostatecznie dziedziczy po klasie Podatnik dwukrotnie. To prowadzi do dwuznaczności przy odwoływaniu się do pól dziedziczonych z Podatnik-a. Tutaj poczytaj o problemie i samym dziedziczeniu wirtualnym:
https://en.wikipedia.org/wiki/Virtual_inheritance
https://isocpp.org/wiki/faq/multiple-inheritance#mi-diamond

I raczej nie używaj takiej deklaracji typu zwracanego. Czasami się przydaje, ale tutaj jest to zbędne. Po prostu niepotrzebnie komplikuje kod.
komentarz 17 stycznia 2017 przez alchem Obywatel (1,210 p.)

Czytałem o tym i wiem na czym polega problem jak i  w jaki sposób 'vitrual' go rozwiązuje jednak to nie powinno stać na przeszkodzie stworzenia dwóch podklas(?) Podatnik, prawda?

Błąd jest też w drugiej linii i  patrząc teraz chyba na tym polega cały problem
"expected class-name before '{' token " ale część 

class Dzialalnosc: public Osoba_fizyczna, public Firma

wydaje mi się być napisana ok.
 

komentarz 17 stycznia 2017 przez criss Mędrzec (172,590 p.)
Widocznie Dzialalnosc nie wie czym jest Firma. Zaincludowales wlasciwe pliki?
komentarz 17 stycznia 2017 przez alchem Obywatel (1,210 p.)

Ok, znalazłem błąd.

Było :


#include "Podatnik.hpp"
#include "Osoba_fizyczna.hpp"
#include "dzialalnosc.hpp"
#include "Firma.hpp"

zamiast 

#include "Podatnik.hpp"
#include "Osoba_fizyczna.hpp"
#include "Firma.hpp"
#include "dzialalnosc.hpp"

Dzięki 

Podobne pytania

0 głosów
1 odpowiedź 209 wizyt
pytanie zadane 11 stycznia 2016 w C i C++ przez Melchior Obywatel (1,300 p.)
+1 głos
3 odpowiedzi 1,711 wizyt
pytanie zadane 8 stycznia 2016 w C i C++ przez PoProstuTomasz Początkujący (470 p.)
0 głosów
1 odpowiedź 561 wizyt

92,539 zapytań

141,382 odpowiedzi

319,476 komentarzy

61,928 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

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy 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!

...