Avatar billede brian0905 Nybegynder
21. maj 2003 - 21:04 Der er 12 kommentarer og
1 løsning

Arrays i klasser - igen

Jeg har stadig lidt problemer med arrays i klasser. Denne gang drejer det sig om at få lagt to objekter ind i et array på en klasse, give dem værdier og bagefter skrive dem til skærmen. Eksempelvis har jeg en klasse Building:

class Building
{
private:
string name;
string description;
int hitpoints;
int nmbr_people;
Technology *required_technology;

public:
Building(string name);
Building();
~Building();
void setName(string newName);
void setDescription(string newDescription);
void setHitpoints(int newAmount);
void setNumberOfPeople(int newAmount);
void setRequiredTechnology(Technology *newTechnology);


string getName();
string getDescription();
int getHitpoints();
int getNumberOfPeople();
Technology getRequiredTechnology();
};

Jeg har også en klasse technology som ser således ud:

class Technology
{
private:
string name;
string description;
public:
// class constructor
Technology();
Technology(string newName, string newDescription);
// class destructor
~Technology();
void setName(string newName);
void setDescription(string newDescription);
string getName();
string getDescription();
};

Problemet er at der skal to objekter af typen Technology knyttes til Building objektet (bare to med hvert sit navn). Når jeg gør dette vil jeg gerne lave dette nummer i min main:

int main(int argc, char *argv[])
{
//opret bygningsobjektet
  Building minBuilding("House");
  ...
  //Opret Technology objektet
  Technology minTechnology, andenTechnology;
  minTechnology.setName("Rope working");
  minTechnology.setDescription("Basic knowledge about ropes");
  Technology minAndenTechnology();
  andenTechnology.setName("Plant knowledge");
  andenTechnology.setDescription("Basic knowledge about plants");

  //Tilføj Technology til Building
  minBuilding.setRequiredTechnology(&minTechnology);
  minBuilding.setRequiredTechnology(&andenTechnology);

//Her går det vel galt???

  //Udskriv de forskellige attributter
...
    cout<<"Technology"<<endl;
  cout<<" |-Name: "<<minBuilding.getRequiredTechnology().getName()<<endl;
  cout<<" |-Name: "<<minBuilding.getRequiredTechnology().getName()<<endl;
  return 0;
}

Mit spørgsmål er nu, hvordan skal jeg modellere min klasse implementation samt min header fil, og hvordan får jeg de to forskellige skrevet til skærmen....håber det er forståeligt, på forhånd tak.
Avatar billede arne_v Ekspert
21. maj 2003 - 21:10 #1
Du tilføjer et member no_technologies til Building klassen.

Building::Building()
{
  no_technologies = 0;
  required_technologies = new Technology[10]; // så er der plads til 10
}

void Building::setRequiredTechnology(Technology & newTcehnology)
{
  required_technologies[no_technologies] = newTechnology;
  no_technologies++;
}
Avatar billede soreno Praktikant
21. maj 2003 - 21:11 #2
Altså du vil have hjælp til at kode implementationen af klasserne ?
Avatar billede arne_v Ekspert
21. maj 2003 - 21:11 #3
Og ændrer:

Technology getRequiredTechnology();

til:

Technology getRequiredTechnology(int ix);
Avatar billede arne_v Ekspert
21. maj 2003 - 21:11 #4
Og tilføjer:

int getNoTechnologies();
Avatar billede soreno Praktikant
21. maj 2003 - 21:12 #5
Når du allokerer memory med new skal det også slettes igen.

Destructor:
Building::~Building()
{
  delete [] required_technologies;
}
Avatar billede arne_v Ekspert
21. maj 2003 - 21:12 #6
int Building::getRequiredTechnology(int ix)
{
  return required_technologies[ix];
}

int Building::getNoTechnologies()
{
  return no_technologies;
}
Avatar billede arne_v Ekspert
21. maj 2003 - 21:16 #7
Ovenstående skulle være rimeligt fleksibelt.

Søren har naturligvis ret i at man skal huske at deallokere.

Det kunne forbedres lidt ved i.s.f. at bruge et fixed size array
at bruge STL vector.

Men hvis du kun regner med 2 teknologier, så er et fixed size array godt nok.
Avatar billede brian0905 Nybegynder
21. maj 2003 - 21:18 #8
Hvorfor skal min getRequiredTechnology(int ix) returnere et heltal, og ikke en Technology, er det ikke det den rent faktisk får fat i indei return statementen?
Avatar billede arne_v Ekspert
21. maj 2003 - 21:24 #9
Det er en fejl selvfølgelig skal den returnere en Technology.

Det skrev jeg også i erklæringen.

Men jeg skrev forkert i implementationen.

Sorry.
Avatar billede soreno Praktikant
21. maj 2003 - 21:24 #10
Det er nok bare en typo, det skal være:

Technology Building::getRequiredTechnology(int ix)
Avatar billede brian0905 Nybegynder
21. maj 2003 - 21:33 #11
Jeg takker, endnu en gang og håber det går bedre end sidst..
Avatar billede brian0905 Nybegynder
21. maj 2003 - 22:12 #12
Det virker sgu 8-D
Avatar billede arne_v Ekspert
21. maj 2003 - 22:14 #13
:-)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester