25. maj 2003 - 14:38Der 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;
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.
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.
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; }
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.
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...
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 }
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...
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]; }
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...
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.
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.
Synes godt om
Ny brugerNybegynder
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.