Avatar billede brian0905 Nybegynder
25. maj 2003 - 14:38 Der er 9 kommentarer og
1 løsning

Nedarvning problem i klasser, sætter ikke værdi

Hej,
Jeg er ved at kigge på lidt nedarvning, men løber panden mod mure hver gang synes jeg. Jeg har lavet en super klasse, med en håndfuld members samt set og get metoder... Jeg har også lavet en klasse der arver fra denne, og tilføjer nogle yderligere private members (i super klassen er members protected). Når jeg så kalder min constructor i min nedarvede klasse med en parameter, og efterfølgende skriver det ud, kommer der ikke noget, faktisk sker der overhovedet ikke noget efter dette kald, ikke engang en alm. cout<<"test"<<endl; eksempler ses nedenunder:
#ifndef BUILDING_H
#define BUILDING_H
#include <string>
#include "Age.h"
#include "Technology.h"
#include "Ressource.h"


using namespace std;
class Building
{
protected:
string name;
string description;
int hitpoints;
Age age;
//hvad koster det
Ressource *Ressourcer;
Age required_age;
Technology *required_technology;
Building *required_buildings;
Ressource *required_ressources;
int number_of_technologies;
int number_of_Buildings;
int number_of_ressources;

public:
Building(string name);
Building();
~Building();
void setName(string newName);
void setDescription(string newDescription);
void setHitpoints(int newAmount);
void setAge(Age newAge);
void setRequiredAge(Age newAge);
void setRequiredTechnology(Technology &newTechnology);
void setRequiredBuildings(Building &requiredBuildings);
void setRequiredRessources(Ressource &requiredRessources);

string getName();
string getDescription();
int getHitpoints();
Age getAge();
Ressource getRessources(int number);
Technology getRequiredTechnology(int ix);
Ressource getRequiredRessource(int number);
Age getRequiredAge();
int getNoTechnologies();
};

#endif // BUILDING_H

Dette var base klassen, her er så den nedarvede klasse:

#ifndef HABITATION_H
#define HABITATION_H
#include<iostream>
#include "Building.h"
#include<string>

using namespace std;

class Habitation:public Building
{
private:
    int number_of_people;
public:
    Habitation(string name);
    Habitation();
    virtual ~Habitation();
    int getNumberOfPeople();
    void setNumberOfPeople(int amount);
};

#endif // HABITATION_H

Problemet kommer så når jeg kalder funktionen fra min main, så sker der ingenting!

#include <iostream>
#include <stdlib.h>
//#include "Building.h" //er med i habitation
#include "Habitation.h"
#include "Age.h"
#include "Research.h"
#include "Technology.h"

int main()
{
    //opret bygningsobjektet
    cout<<"Test før constructor..."<<endl;
    //cout<<"Sizeof Habitation = "<<sizeof(Habitation)<<endl;
    Habitation minBuilding("mit lille hus");
cout<<"Test efter constructor..."<<endl;
return 0;
}

jeg får aldrig skrevet noget som helst ud (ikke engang den anden cout), hvad gør jeg forkert??? Håber at mine headerfiler er nok til at se hvad der sker i programmet.
Avatar billede bertelbrander Novice
26. maj 2003 - 00:25 #1
Får du udskrevet "Test før constructor..." ?
Hvordan ser din konstruktor ud?
Avatar billede segmose Nybegynder
26. maj 2003 - 13:29 #2
Kunne du delagtigøre os i implementeringen af dine constructers?
Avatar billede brian0905 Nybegynder
26. maj 2003 - 17:38 #3
Jeg får skrevet den første cout ud, men det er også det, ikke andet. Alt det der kommer efter min objekt deklaration bliver ikke vist. ikke engang den udskrift jeg laver i min habitation constructor (bemærk at jeg har skåret meget kode væk, på building er der kun name tilbage)

Dette er headerfilen til building klassen. Dette er superklassen.

#ifndef BUILDING_H
#define BUILDING_H
#include <string>

class Building
{
protected:
string name;

public:
Building(string name);
Building();
~Building();
void setName(string newName);
string getName();
};
#endif // BUILDING_H

Her er implementationen af building klassen

#include "building.h" // class's header file
#include<iostream>
using namespace std;
// class constructor

Building::Building(string newName)
{
    name=newName;
}

Building::Building()
{
}

Building::~Building()
{
}

void Building::setName(string newName)
{
name=newName;
}
string Building::getName()
{
return name;
}

Her er headerfilen til habitation klassen, dette er den klasse der arver fra building

#ifndef HABITATION_H
#define HABITATION_H
#include<iostream>
#include "Building.h"
#include<string>

using namespace std;

class Habitation:public Building
{
private:
    int number_of_people;
public:
    Habitation(string name);
    Habitation();
    virtual ~Habitation();
    int getNumberOfPeople();
    void setNumberOfPeople(int amount);
};

#endif // HABITATION_H

Her kommer så implementationen af denne klasse

#include "Habitation.h"

Habitation::Habitation(string newName):Building(newName)
{
    cout<<"constructor"<<endl;
    Building test("building");
    name=newName;
}

Habitation::Habitation()
{
}

Habitation::~Habitation()
{
}

void Habitation::setNumberOfPeople(int amount)
{
    number_of_people=amount;
}

int Habitation::getNumberOfPeople()
{
    return number_of_people;
}
Avatar billede bertelbrander Novice
26. maj 2003 - 18:14 #4
Jeg har lavet en c++ fil ud af de to stumper kode, og tilføjet følgende i toppen:
class Age
{
public:
  Age();
  ~Age();
};

class Ressource
{
public:
  Ressource();
  ~Ressource();
};

class Technology
{
public:
  Technology();
  ~Technology();
};

Og følgende i bunden:
Age::Age()
{
}
Age::~Age()
{
}
Samt fjernet #include af de filer der ikke eksisterer. Herefter kører programmet fint og skriver:
Test før constructor...
constructor
Test efter constructor...

Så fejlen må ligge i en af de construct'orer vi ikke har set.
Avatar billede brian0905 Nybegynder
26. maj 2003 - 20:08 #5
Lyder lidt mystisk for mig..... jeg kan ikke få noget som helst til at virke. Hvis det kan hjælpe kan hele kildekoden findes her (kun klasserne og en simpel main), det er VC++ og det kan compile, men ikke køre...

http://www.vikingworks.dk/eksperten/Prototype2.zip

Tak for hjælpen.......
Avatar billede brian0905 Nybegynder
26. maj 2003 - 20:11 #6
Ahaaa...fandt selv en fejl, jeg initialiserer nogle arrays i min  building constructor, hvis jeg udkommenterer disse, virker det hele som det skal. Hvorfor vil det ikke virke med disse??? eksempelvis:

Building::Building(string newName)
{
    name=newName;
    //number_of_technologies=0;
    //required_technology = new Technology[2]; // så er der plads til 2
    //number_of_ressources=0;
    //required_ressources = new Ressource[2]; //så er der plads til 2 required ressourcer
}

Building::Building()
{
    //number_of_technologies=0;
    //required_technology = new Technology[2]; // så er der plads til 2
}

// class destructor
Building::~Building()
{
    //delete [] required_technology;
    //delete [] required_ressources;
}

Når jeg har udkommenteret det som vist ovenfor virker det som det skal. Listernes primære opgave er at blive fyldt op med teknologier, således der eksisterer flere ressources eller lignende på en building...
Avatar billede bertelbrander Novice
26. maj 2003 - 23:07 #7
Det er ikke nogen god ide at lave nye objekter af en class i constructoren for  den samme class, derved bliver construktoren kaldt rekursivt uendeligt, indtil der kommer stak overflov, eller winodws løber tom for memory:

Technology::Technology()
{
  //her initialiseres arrayene til at holde de forskellige teknologier
  number_of_required_technologies=0;
  number_of_allowed_technologies=0;
  requiredtechnologies = new Technology[2]; // så er der plads til 2
  allowedtechnologies = new Technology[2];
}
Avatar billede brian0905 Nybegynder
27. maj 2003 - 20:00 #8
Hvis ikke dette er en god ide, (og nu kan jeg egentligt godt se hvad du mener) hvordan kan man løse det ? de arrays laves for at kunne holde en vis mængde andre objekter, fx. 2 Techn ology objekter. Og som du sikkert kan forestille dig, så skal der opfindes et vis antal teknologier i mit spil inden en ny kan opfindes....... men stadig skal Habitation arve fra Building...
Avatar billede bertelbrander Novice
28. maj 2003 - 00:02 #9
Lad os se om jeg har forstået det korrekt:
En teknologi (et object af typen Technology) er afhængig af andre teknologier, man skal f.ex bruge viden om reb og blomster for at kunne udvikle blomsterbinder teknologien.
Hver building (eller en af de class'er der nedarver fra Building) har en række teknologier, og flere teknologier vil blive udviklet i løbet af spillet.

Hvis dette er korrekt vil jeg lade hver building "eje" teknologierne, og så lade teknologierne have pointere/referencer til disse teknologier, dvs ikke selv lave sine egne Technology objekter.
Avatar billede segmose Nybegynder
28. maj 2003 - 10:22 #10
Eller hvis du vil have tech i building, så byg træet op efter constructor er færdig, dvs. der hvor du er færdig med hele den class hvor building indgår, så kald det object med en funk fx. hus->setup(tech1, tech2); hvor setup er en funktion i building.
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