webForumDet fria alternativet

Problem med arv

2 svar · 262 visningar · startad av axel_k1990

axel_k1990Medlem sedan apr. 20056 inlägg
#1

Hur gör man för att kunna använda exempelvis förnamn från klassen Person i objektet Elev. Det vill säga att ändra till exempel förnamn och bidrag i klassen Elev. Koden till klasserna ser ut så här.

#include <string>
using namespace std;

class Person {
private:
 string fnamn;   
 string enamn;   
 string gatuadr; 
 string postadr; 
 int postnr;
 int telnr;

public:
 Person(string f, string e, string g, int pn, string pa, int t) {
  fnamn = f;
  enamn = e;
  gatuadr = g;
  postnr = pn; 
  postadr = pa;
  telnr = t;

 }
};

int main() {
 Person *p;
 p = new Person("Sven", "Karlsson", "Drottninggatan 5", 64633, "Gnesta", 015822231);
}

//Elev

class Elev:public Person
{
public:
        Elev(int bidrag);
        ~Elev();
        setBidrag(int bidrag);
        getBidrag();

private:
        int Bidrag;
}

Elev::Elev(int bidrag)
{
}

Elev::setBidrag(int bidrag)
{
        Bidrag=bidrag;
}
Elev::Visa()
{
        cout <<Bidrag<<;
}

int main()

{
	Elev Sven(4400);
	Sven.getBidrag();
};
spangoMedlem sedan juni 20008 205 inlägg
#2

Eftersom fnamn (och de andra grejerna) är privata för Person-klassen, kan den inte kommas åt direkt, vare sig från subklasser eller från andra objekt. Du får ha accessmetoder, precis som du gjort med bidraget.

#include <string>
using namespace std;

class Person {
private:
    // Alla variabeldeklarationer som tidigare
public:
     Person(string f, string e, string g, int pn, string pa, int t) {
        // Konstruktorn som tidigare
    }
    string getFNamn() const { return fnamn; } // ge förnamn
    string getENamn() const { return enamn; } // ge efternamn
};

// och så vidare som tidigare

Elev::Visa(){
        cout << getFNamn() << " håvar in " << Bidrag << " kr. i bidrag." << endl;
}

(const-grejerna talar om att metoden inte ändrar på något i objektet. Inte strikt nödvändiga här, men det är lika bra att vänja sig vid dem.)

Sang-draxMedlem sedan juli 2002581 inlägg
#3

Skall man vara lite petig skall inte bara metoden deklareras som const, utan även returtypen, eftersom att sådan här kod annars tillåts:

person.getFörnamn() = "Agare";

vilket kan lätt misstolkas. Ingen jätteviktig ändring dock.

121 ms totalt · 3 externa anrop · v20260731065814-full.30151723
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
119 ms — hämta tråd, inlägg och bilagor (db)