Jump to content

SUBIECTE NOI
« 1 / 5 »
RSS
De la 24V la 5V DC?

Deducere TVA

Intalnire cu un tip de pe tinder ...

Open WRT nu sincronizeaza ceasul ...
 salariu plafonat

sistem actionare electrica pentru...

Sfaturi achizitie auto ~10k€

ICC/ICM soft monitorizare si cont...
 Recomandare ipad

Ce fel de disc pentru acest circu...

Windows 11 24H2 pe release?

Intrebare motor auto
 Opel Astra K

Romania - tara formelor fara fond?

Probleme sistem audio mașina

Radio care se incinge
 

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,270
  • Î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,270
  • Înscris: 24.02.2007
Ce eroare ti-a dat compilatorul la varianta incercata cu mai multe fisiere?

Anunturi

Chirurgia cranio-cerebrală minim invazivă Chirurgia cranio-cerebrală minim invazivă

Tehnicile minim invazive impun utilizarea unei tehnologii ultramoderne.

Endoscoapele operatorii de diverse tipuri, microscopul operator dedicat, neuronavigația, neuroelectrofiziologia, tehnicile avansate de anestezie, chirurgia cu pacientul treaz reprezintă armamentarium fără de care neurochirurgia prin "gaura cheii" nu ar fi posibilă. Folosind tehnicile de mai sus, tratăm un spectru larg de patologii cranio-cerebrale.

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