Jump to content

SUBIECTE NOI
« 1 / 5 »
RSS
Consum ulei masina de tuns iarba...

"Moda" tinerilor care se ...

E.on energie aplicație intre...

Masina de tuns... buruieni
 Recomandare drona

Exista un soft care sa reia autom...

Identificare plante

Cum declari o variabila care nu s...
 Schimbare certificat de inmatricu...

Poligon auto București

nelamurire legata de pret la mode...

Hotel cu restaurant si Demipensiu...
 Croaziera in Mediterana de Vest 1...

Copilot are pica pe Vladimir Putin

MicroSoft Edge: Cum pun Google in...

Dashcam
 

Mostenire multipla cu mai multe fisiere - ce/ cum sa includ ?

- - - - -
  • Please log in to reply
9 replies to this topic

#1
lowly

lowly

    Junior Member

  • Grup: Members
  • Posts: 98
  • Înscris: 17.11.2012
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;
}



#2
dani.user

dani.user

    Guru Member

  • Grup: Senior Members
  • Posts: 30,243
  • Înscris: 24.02.2007
Include guards ai folosit?

#3
WinstonMontana

WinstonMontana

    Active Member

  • Grup: Members
  • Posts: 1,913
  • Înscris: 20.02.2018
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
Mosotti

Mosotti

    Geniu umil

  • Grup: Senior Members
  • Posts: 33,295
  • Înscris: 21.04.2004
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
lowly

lowly

    Junior Member

  • Grup: Members
  • Posts: 98
  • Înscris: 17.11.2012

View PostWinstonMontana, 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();
}

Stiu, dar nu pot reformula cerintele Posted Image

#6
lowly

lowly

    Junior Member

  • Grup: Members
  • Posts: 98
  • Înscris: 17.11.2012

View PostMosotti, 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.
Imi poti da exemplu, te rog, ce trebuie sa includ in headerele pentru clasele de mai sus ? (Masina.h, MasinaOras.h, Dacia.h, Opel.h, SUV.h, RangeRover.h) Dar si ce ar trebui inclus in main pentru a functiona codul..

P.s. cum se numeste relatia C mosteneste pe B, iar B pe A ?

#7
Mosotti

Mosotti

    Geniu umil

  • Grup: Senior Members
  • Posts: 33,295
  • Înscris: 21.04.2004
Se numeste multilevel. Nu pot sa dau exemplu ca-s pe telefon :lol:

#8
WinstonMontana

WinstonMontana

    Active Member

  • Grup: Members
  • Posts: 1,913
  • Înscris: 20.02.2018

View Postlowly, on 06 iunie 2018 - 08:12, said:

Stiu, dar nu pot reformula cerintele Posted Image
pai deocamdata tu ai problemele in a intelege mostenirea si mostenirea multipla   Posted Image

#9
lowly

lowly

    Junior Member

  • Grup: Members
  • Posts: 98
  • Înscris: 17.11.2012

View PostWinstonMontana, on 06 iunie 2018 - 09:54, said:

pai deocamdata tu ai problemele in a intelege mostenirea si mostenirea multipla   Posted Image
Daca fac totul intr-un fisier e ok, nu stiu cum sa fa includ cand fac folosind mai multe fisiere

#10
dani.user

dani.user

    Guru Member

  • Grup: Senior Members
  • Posts: 30,243
  • Înscris: 24.02.2007
Ce eroare ti-a dat compilatorul la varianta incercata cu mai multe fisiere?

Anunturi

Neurochirurgie minim invazivă Neurochirurgie minim invazivă

"Primum non nocere" este ideea ce a deschis drumul medicinei spre minim invaziv.

Avansul tehnologic extraordinar din ultimele decenii a permis dezvoltarea tuturor domeniilor medicinei. Microscopul operator, neuronavigația, tehnicile anestezice avansate permit intervenții chirurgicale tot mai precise, tot mai sigure. Neurochirurgia minim invazivă, sau prin "gaura cheii", oferă pacienților posibilitatea de a se opera cu riscuri minime, fie ele neurologice, infecțioase, medicale sau estetice.

www.neurohope.ro

0 user(s) are reading this topic

0 members, 0 guests, 0 anonymous users

Forumul Softpedia foloseste "cookies" pentru a imbunatati experienta utilizatorilor Accept
Pentru detalii si optiuni legate de cookies si datele personale, consultati Politica de utilizare cookies si Politica de confidentialitate