Gå til innhold

Et lite Oblig problem. *Løst*


Anbefalte innlegg

Jeg sitter å skal levere en oblig i OOP kurs på skolen, grei liten sak bortsett fra at jeg ikke klarer å komme på noe som kan få til dette:

 

- Lag også en constructor til klassen ”fisk” som tar fiskenavnet som parameter. La constructorene fortsatt lese det som trengs for ”fisk” og ”dyr i vann”, og send fiskenavnet som parameter oppover i arvehierarkiet slik at ”dyr” slipper å lese inn navnet.

 

Jeg har gjort om "Dyr i vann" til "vann" for enkelhetens skyld.

 

Det jeg ikke skjønner er, hvordan skal jeg få den til å lese inn all infoen, men ungå å kalle på dyr::getdata() og alikevel få inn navnet i variablen navn. Behøver kanskje ikke ungå å kalle på dyr::getdata() men bare ikke stille spørsmålet om å Skrive navn. Var i hvert fall slik jeg forstod meg på oppgaven.

 

Håper noen skjønner problemet og kan hjelpe meg med det.

 

class dyr
{
protected:
 char navn(LEN)    	//Dyrets navn
public:
getdata()      	//leser in dyrets navn
{cout << "\nSkriv Navn: "; cin navn; cout << '\n';}
putdata()      	//Skriver dyrets navn
{cout << "Navn: " << navn << endl;}	
};
class vann : public dyr
{
protected:
char type[LEN];
public:
getdata()      	
{        	//leser inn vanntype dyret lever i
 dyr::getdata();    	//kjører getdata() fra dyr klassen
 cout << "Fisk eller Skalldyr? :"; cin type;
}
putdata()
{
 dyr::putdata();
 cout << "Miljø: Vann\n Type: " << type << endl;
}
};
class fisk : public vann
{
private:
char farge[LEN];
public:        	
getdata()      	//Leser inn fargen til fisken
{
 vann::getdata();    //kjører getdata() fra vann klassen
 cout << "Hvilken Farge har fisken?: "; cin farge;
}
getdata(char n)
{
*Her var det jeg trengte hjelp*	
       }
pudata()
{
 vann::putdata();
 cout << "Farge: " << farge << endl;
}
};

 

så forresten at jeg ikke hadde satt noen type forann hver eneste funskjon. Ignorer det. fikser det i dette øyeblikk:P

Endret av bugbear
Lenke til kommentar
Videoannonse
Annonse

Oppgaven går ut på å lage 7 klasser i et arv-hiarki hvor alle har en default constructor som leser inn egne data, for så å kjøre constructoren til klassen den arver fra (som igjen leser sin data og kjører contructoren til den klassen den arver fra). Dette betyr at du ikke trenger den getdata() funksjonen da selve constructoren skal ta seg av dette.

 

Det du må gjøre på den fisk-delen av oppgaven er:

 

Ved menyvalget for fisk leser du inn en streng fra tastatur, sjekker om den er tom, hvis tom oppretter du et fisk objekt uten parametere til constructoren, hvis det som er innlest ikke er blankt skal du opprette fisk med å sende med som parameter det du leste inn fra tastatur. Dette skal flyttes til toppen av hiarkiet (dvs Dyr klassen), og først der skal det kopieres inn i Dyr sitt navn-felt. Dette betyr da at fisk, samt alle den arver fra oppover, trenger en constructor til som tar en tekststreng som parameter.

 

getdata(char n)

{

*Her var det jeg trengte hjelp*

      }

getdata er som sagt ikke nødvendig da innlesing skal skje i constructoren. Istedenfor har du noe ala dette:

 

fisk(char navn[]) : dyr_i_vann(navn) { /*innlesing av annen relevant data*/ }

 

Det som skjer er da at fisk objektet tar en char array, også kjent som tekststreng, som argument og kjører dyr_i_vann sin constructor med samme tekststreng som parameter. På den måten blir den dyttet oppover i hiarkiet.

 

Legg spesielt merke til at jeg i motsetning til getdata() koden din har lagt til [] på slutten av argumentet. Det er som sagt for at man skal kunne motta en tekststreng (array) istedenfor kun en enkelt bokstav.

 

Du har også en feil helt øverst i koden din:

  char navn(LEN)    //Dyrets navn

 

Ellers er du godt på vei på denne oppgaven. Hvis du bytter ut getdata() med contructorer så er det ikke mye som gjenstår.

 

Håper dette hjelper. Hadde vært enklere hvis du hadde vært til stede på fredag så jeg kunne illustrert med penn & papir eller på tavla. Jonas sitter på lab på mandag.

 

Btw, er du en av "mine" elever, eller Jonas sine?

 

Mvh Sverre Bakke, Fagassistent Objekt-orientert programmering v/Høgskolen i Gjøvik.

Endret av invictus
Lenke til kommentar

Hehe, jess men det var en hersens matteprøve på fredag. Får vel slite litt idag da, alt på nytt :S, tungvinne constructorer:(

 

 

Jeg er nok en av dine elever. Har ikke vært så mye på skolen enda i år så har ikke vært i time enda :S

 

Forbannet være World of Warcraft.

Endret av bugbear
Lenke til kommentar
Hehe, jess men det var en hersens matteprøve på fredag. Får vel slite litt idag da, alt på nytt :S, tungvinne constructorer:(

 

Det du trenger er nesten bare å gjøre om getdata() funksjonene dine til constructorer, fordi innmaten er riktig.

 

Også legge til en ekstra constructor som sender char arrayen oppover i hiarkiet da.

 

Jeg er nok en av dine elever. Har ikke vært så mye på skolen enda i år så har ikke vært i time enda :S

 

Ok, jeg forstår. Send en mail eller si i fra på msn/googletalk hvis du sitter fast igjen da vettu :) Fristen nærmer seg og det er bedre at du spør enn at du ikke får det til :)

 

Adressene er: mittfornavn punktum mittetternavn krøllalfa hig punktum no _eller_ gmail punktum com

 

Men anbefaler deg på det sterkeste å møte opp på onsdager og på lab før obliger.

 

Forbannet være World of Warcraft.

5596007[/snapback]

Jeg kjenner til problemet. Var i samme situasjon før jul selv. Var litt av et slit å "avvennes" fra spillet.

Endret av invictus
Lenke til kommentar

Yes, blir nok en del timer idag, men skal nok få det til. Takker

 

Edit: Ja da ble jeg ferdig trur jeg. Ser riktig ut?

 

#include <iostream>
#include <cstring>    	//for strcpy

using namespace std;

int const LEN=80;    	//for enkelt å endre maxlengede på stringer

///////////////////////////////////////////////////////////////////////////////
class dyr
{
protected:
char navn[LEN];
public:
dyr()      	//leser infoen til dyr
{ cout << "Navn: " << '\t'; cin >> navn;	}

dyr(char n[LEN])    //kopierer  string n til navn
{ strcpy_s(navn, n);}

void putdata()    	//skriver info i dyr
{
 cout << "\nNavn: " << '\t' << navn;
}
};
///////////////////////////////////////////////////////////////////////////////
class dyr_i_vann : public dyr
{
protected:
char form[LEN];
public:
       	//leser infoen untatt navn
       	// som blir sent som parameter
dyr_i_vann(char n[]) : dyr(n) 
{
 cout << "Form: " << '\t'; cin >> form;
}
dyr_i_vann() : dyr()  	//leser infoen til dyr_i_vann
{
 cout << "Form: " << '\t'; cin >> form;
}
void putdata()    	//skriver info i dyr_i_vann
{
 dyr::putdata();
 cout << "\nForm: " << '\t' << form;
}
};
///////////////////////////////////////////////////////////////////////////////
class fisk : public dyr_i_vann
{
private:
char farge[LEN];
public:
       	//leser infoen untatt navn
       	// som blir sent som parameter
fisk(char n[]) : dyr_i_vann(n)
{
 cout << "Farge: " << '\t'; cin >> farge;
 putdata();
}
fisk() : dyr_i_vann()  	//leser infoen til fisk
{
 cout << "Farge: " << '\t'; cin >> farge;
 putdata();    	//skriver ut når info er lagt til
}
void putdata()    	//skriver info i fisk
{
 dyr_i_vann::putdata();
 cout << "\nFarge: " << '\t' << farge << endl;
}
};
///////////////////////////////////////////////////////////////////////////////
class skalldyr : public dyr_i_vann
{
private:
char farge[LEN];
public:
skalldyr() : dyr_i_vann()  //leser infoen til skalldyr
{
 cout << "Farge: " << '\t'; cin >> farge;
 putdata();    	//skriver ut når info er lagt til
}
void putdata()    	//skriver info i skalldyr
{
 dyr_i_vann::putdata();
 cout << "\nFarge: " << '\t' << farge << endl;
}
};
///////////////////////////////////////////////////////////////////////////////
class dyr_i_luft : public dyr
{
protected:
char form[LEN];
public:
dyr_i_luft() : dyr()  	//Leser infoen til dyr_i_luft
{
 cout << "Form: " << '\t'; cin >> form;
}
void putdata()    	//Skriver info i dyr_i_luft
{
 dyr::putdata();
 cout << "\nForm: " << '\t' << form;
}
};
///////////////////////////////////////////////////////////////////////////////
class fugl : public dyr_i_luft
{
private:
char farge[LEN];
public:
fugl() : dyr_i_luft()  	//Leser inn infoen til fugl
{
 cout << "Farge: " << '\t'; cin >> farge;
 putdata();    	//skriver ut når info er lagt til
}
void putdata()    	//Skriver info i fugl
{
 dyr_i_luft::putdata();
 cout << "\nFarge: " << '\t' << farge << endl;
}
};
///////////////////////////////////////////////////////////////////////////////
class insekt : public dyr_i_luft
{
private:
char farge[LEN];
public:
insekt() : dyr_i_luft()  	//Leser inn infoen til insekt
{
 cout << "Farge: " << '\t'; cin >> farge;
 putdata();    	//skriver ut når info er lagt til
}
void putdata()    	//Skriver info i insekt.
{
 dyr_i_luft::putdata();
 cout << "\nFarge: " << '\t' << farge << endl;
}
};

///////////////////////////////////////////////////////////////////////////////
int main()
{
int svar;
 do {
 	cout << "Hvilken dyreart vil du registrere?\n"
    << "\t\t1=Insekt \n\t\t2=Fugl"
    << "\n\t\t3=Fisk \n\t\t4=Skalldyr\nSvar: ";
 	cin >> svar;
 } while (svar <= 0 || svar >= 5);
 
       	//leser inn all info for valgt dyr
 switch( svar )
 {
 case 1:
 	{
   insekt in;
 	}
 	break;
 
 case 2:
 	{
   fugl fu;
 	}
 	break;
 
 case 3:
 	{      //**ikke sikker på at denne funker helt**
       	//char variable som sjekker om Navn
       	// angis eller om dyr::dyr() må kalles på
       	// skulle vært "om bare enter tastes, så
       	// går den videre til å kalle på dyr::dyr()
       	// ettersom det var slik jeg forstod det
       	// skulle gjøres.
   
   char ch[LEN];  
   cout << "Navn: "; cin.getline(ch, LEN); cout << endl;
   if (strlen(ch) != 0 )
   	{ fisk fi(ch); }
   else { fisk fi; }
 	}
 	break;
 case 4:
 	{
   skalldyr sk;
 	}
 	break;
 }
system("pause");    
return 0;
}

Endret av bugbear
Lenke til kommentar

Har litt dårlig tid, men det ser i farten veldig bra ut. Selv den delen du er usikker på ser ut til å være korrekt. Du har glemt å skrive ut i gjen dataen til skjerm etter at du har opprettet objektene (som faktisk er den del av oppgaven), men ellers ser det ganske riktig ut.

 

Min egen kode er ganske lik, bortsett fra at jeg konsekvent bruker cin.getline() eller cin.get() til å lese tekststrenger. I tillegg kan det være lurt å ta en titt på cin.ignore() i forbindelse med det ettersom jeg forstod det slik at mange har slitt med akkurat det. Sistnevnte gjelder vel bare hvis du har problemer med at linjeskift blir automatisk gitt på innlesinger som venter på linjeskift. Jeg er tilgjengelig på mail i hele dag så du får bare sende en mail hvis du sitter fast ytterligere.

Endret av invictus
Lenke til kommentar
Har ikke glemt det, ligger i constructorene. Takk for all hjelp skal ikke gå gjennom forumet om jeg lurer på mer.

5602006[/snapback]

 

Det er ikke noe galt i å spørre om hjelp av andre som kan C++ så lenge du gjør oppgaven selv, men det er nok mer effektivt å spørre oss som blir betalt for å hjelpe til og som har god innsikt i oppgaven :)

Endret av invictus
Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
×
×
  • Opprett ny...