Mostenire multipla cu mai multe fisiere - ce/ cum sa includ ?
Last Updated: Jun 06 2018 18:20, Started by
lowly
, Jun 05 2018 14:09
·
0
#1
Posted 05 June 2018 - 14:09
Salut, am mai multe clase intr-un main si as vrea sa fac header si cpp pentru fiecare clasa. Pentru aproape fiecare clasa am mosteniri si habar nu am cum sa includ sa imi ruleze ( am incercat, am ajuns la capatul rabdarii)
La final banuiesc ca ar trebui sa includ toate clase in main.cpp, ma incurc in fisierele header... mai jos am pus tot codul. Ce ar trebui sa includ pentru fiecare header de la fiecare clasa ? Eu puneam doar clasa din care este derivata si #include<string>Cum fac eu: MasinaOras.h #include "Masina.h" #include<string> class MasinaOras : public Masina { ... ... ... }Dacia.h #include "MasinaOras.h" #include<string> class Dacia : public MasinaOras { ... ... ...}etc main.cpp #include<iostream> #include "Masina.h" #include "MasinaOras.h" #include "Dacia.h" ... ... int main{ ... ... ...} Tot codul: #include <iostream> #include <string> using namespace std; class Masina { public: virtual string getName() = 0; }; class MasinaOras : public Masina { public: virtual int getCapacitate() = 0; virtual string getCuloare() = 0; }; class Dacia : public MasinaOras { int capacitate; string culoare; public: void setCapacitate(int cap) { capacitate = cap; } void setCuloare(string col) { culoare = col; } int getCapacitate() { return capacitate; } string getCuloare() { return culoare; } string getName() { return "Dacia"; } }; class Opel : public MasinaOras { int capacitate; string culoare; int anFabricatie; public: void setCapacitate(int cap) { capacitate = cap; } void setCuloare(string col) { culoare = col; } void setAnFabricatie(int an) { anFabricatie = an; } int getAnFabricatie() { return anFabricatie; } int getCapacitate() { return capacitate; } string getCuloare() { return culoare; } string getName() { return "Opel"; } }; class SUV : public Masina { public: virtual int getConsum() = 0; }; class RangeRover : public SUV { int consum; public: void setConsum(int con) { consum = con; } int getConsum() { return consum; } string getName() { return "RangeRover"; } }; int main() { Opel o; o.setCapacitate(100); o.setCuloare("rosu"); o.setAnFabricatie(2000); MasinaOras* m = &o; cout << m->getName() << "," << m->getCuloare() << "," << m->getCapacitate() << "," << o.getAnFabricatie() << endl; return 1; } |
#3
Posted 06 June 2018 - 06:10
Initator, tot programul tau este echivalent cu :
#include <iostream> #include <cstdlib> #include <string> using namespace std; class Masina { protected: int capacitateRezervorLitri = 0; string culoareExterioara = "#nedefinita"; string marca = "#nedefinita"; public: Masina(){} Masina(int _capacitateRezervorLitri, string _culoareExterioara, string _marca) { capacitateRezervorLitri = _capacitateRezervorLitri; culoareExterioara = _culoareExterioara; marca = _marca; }; int getCapacitateRezervorLitri() {return capacitateRezervorLitri;} string getCuloareExterioara(){return culoareExterioara;} string getMarca(){return marca;} void status() { cout<<"capacitate rezervor litri: " <<capacitateRezervorLitri<<endl; cout<<"culoare exterioara: "<< culoareExterioara<<endl; cout<<"marca:" << marca<<endl; } }; class Opel:public Masina { public: Opel(int _capacitateRezervorLitri, string _culoareExterioara, string _marca) :Masina(_capacitateRezervorLitri, _culoareExterioara, _marca){} }; class Dacia:public Masina { public: Dacia(int _capacitateRezervorLitri, string _culoareExterioara, string _marca) :Masina(_capacitateRezervorLitri, _culoareExterioara, _marca){} }; int main() { Opel baragladina_nemteasca(2, "maro", "astra"); baragladina_nemteasca.status(); Dacia tinicheaCuPatruRoti(1, "rosu", "duster"); tinicheaCuPatruRoti.status(); } |
#4
Posted 06 June 2018 - 08:01
In primul rind, mostenirea multipla nu inseama “A mosteneste din B care mosteneste din C”, ci “A mosteneste din B si C”, ceea ce nu e cazul la tine.
Acuma despre masinile tale, da pentru fiecare clasa 2 fisiere, .h si .cpp, in .h pui doar definitia clasei. Nu uita sa pui include guard, #pragma once sau #ifndef / #define / #endif Nu e obligatoriu, le poti pune si pe toate la un loc, ca intr-o ciorba de potroace, dar e o regula sanatoasa. Apoi oriunde vrei sa folosesti o clasa incluzi header-ul. Da ai in alt header doar un pointer la o clasa, atunci NU incluzi headerul, doar declari clasa, headerul il incluzi doar in fisierul .cpp unde efectiv instantiezi clasa. |
#5
Posted 06 June 2018 - 08:12
WinstonMontana, on 06 iunie 2018 - 06:10, said:
Initator, tot programul tau este echivalent cu : #include <iostream> #include <cstdlib> #include <string> using namespace std; class Masina { protected: int capacitateRezervorLitri = 0; string culoareExterioara = "#nedefinita"; string marca = "#nedefinita"; public: Masina(){} Masina(int _capacitateRezervorLitri, string _culoareExterioara, string _marca) { capacitateRezervorLitri = _capacitateRezervorLitri; culoareExterioara = _culoareExterioara; marca = _marca; }; int getCapacitateRezervorLitri() {return capacitateRezervorLitri;} string getCuloareExterioara(){return culoareExterioara;} string getMarca(){return marca;} void status() { cout<<"capacitate rezervor litri: " <<capacitateRezervorLitri<<endl; cout<<"culoare exterioara: "<< culoareExterioara<<endl; cout<<"marca:" << marca<<endl; } }; class Opel:public Masina { public: Opel(int _capacitateRezervorLitri, string _culoareExterioara, string _marca) :Masina(_capacitateRezervorLitri, _culoareExterioara, _marca){} }; class Dacia:public Masina { public: Dacia(int _capacitateRezervorLitri, string _culoareExterioara, string _marca) :Masina(_capacitateRezervorLitri, _culoareExterioara, _marca){} }; int main() { Opel baragladina_nemteasca(2, "maro", "astra"); baragladina_nemteasca.status(); Dacia tinicheaCuPatruRoti(1, "rosu", "duster"); tinicheaCuPatruRoti.status(); } |
#6
Posted 06 June 2018 - 08:32
Mosotti, on 06 iunie 2018 - 08:01, said:
In primul rind, mostenirea multipla nu inseama “A mosteneste din B care mosteneste din C”, ci “A mosteneste din B si C”, ceea ce nu e cazul la tine. Acuma despre masinile tale, da pentru fiecare clasa 2 fisiere, .h si .cpp, in .h pui doar definitia clasei. Nu uita sa pui include guard, #pragma once sau #ifndef / #define / #endif Nu e obligatoriu, le poti pune si pe toate la un loc, ca intr-o ciorba de potroace, dar e o regula sanatoasa. Apoi oriunde vrei sa folosesti o clasa incluzi header-ul. Da ai in alt header doar un pointer la o clasa, atunci NU incluzi headerul, doar declari clasa, headerul il incluzi doar in fisierul .cpp unde efectiv instantiezi clasa. P.s. cum se numeste relatia C mosteneste pe B, iar B pe A ? |
#7
Posted 06 June 2018 - 09:01
Se numeste multilevel. Nu pot sa dau exemplu ca-s pe telefon
|
#8
Posted 06 June 2018 - 09:54
#9
Posted 06 June 2018 - 12:26
#10
Posted 06 June 2018 - 18:20
Ce eroare ti-a dat compilatorul la varianta incercata cu mai multe fisiere?
|
|
Anunturi
Bun venit pe Forumul Softpedia!
▶ 0 user(s) are reading this topic
0 members, 0 guests, 0 anonymous users