Jump to content

SUBIECTE NOI
« 1 / 5 »
RSS
Incalzire in pardoseala etapizata

Suprataxa card energie?!

Cum era nivelul de trai cam din a...

probleme cu ochelarii
 Impozite pe proprietati de anul v...

teava rezistenta panou apa calda

Acces in Curte din Drum National

Sub mobila de bucatarie si sub fr...
 Rezultat RMN

Numar circuite IPAT si prindere t...

Pareri brgimportchina.ro - teapa ...

Lucruri inaintea vremurilor lor
 Discuții despre TVR Sport HD.

Cost abonament clinica privata

Tremura toata, dar nu de la ro...

Renault Android
 

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,194
  • Î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

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

Stiu, dar nu pot reformula cerintele Posted Image

#6
lowly

lowly

    Junior Member

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

 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.
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

 lowly, 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

 WinstonMontana, 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,194
  • Înscris: 24.02.2007
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

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