07. november 2002 - 18:54Der er
29 kommentarer og 4 løsninger
size of class undefined
Jeg sidder med en class til en cpp fil. og på linien hvor jeg skriver void bog.setBog(){ title = tittel; Forfatter = forfat; Forlag = forl; udgaar = udgar; isbnnummer = isbn;
får jeg fejl "size of 'bog' is unknown or zero"
min class fil "bog.h" ser sådan ud
#include <iostream.h> #include <string> using namespace std;
Forskellige ting som jeg lige hurtigt kan nævne er forkerte:
1) I din cpp-fil implementerer du som soreno siger void setBog(), men den findes ikke i din h-fil.
2) Når du definerer setBog i cpp-filen skriver du: void bog.setBog() Det skal være: void bog::setBog() Jeg er sikker på at det er her din "size of 'bog' is unknown or zero"-fejl opstår.
3) Nu ved jeg ikke om det bare er fordi du har skrevet hurtigt når du har skrevet dit spørgsmål, men det ser lidt ud som om du har nogle problemer med dine variabelnavne... Næsten alle steder hvor du skriver et variabelnavn er de forskellige... Kan selvfølgelig godt være at de rent faktisk er forskellige men jeg tvivler nu lidt ;) hehe PS!!! Husk at der er forskel på store/små bogstaver. Altså, Forfatter og forfatter er to forskellige variabelnavne.
Prøv lige at poste alt hvad der står i din cpp og h fil... Så kan en eller anden eventuelt rette dem igennem og fortælle dig hvordan de skal se ud.
cout<<"ISBN nummer (8 tal) : "; cin>>isbn; cout<<endl; if((isbnnummer[1]+isbnnummer[2]+isbnnummer[3]+isbnnummer[4]+isbnnummer[5]+isbnnummer[6]+isbnnummer[7]+isbnnummer[8]) == 44){ cout<<"Data skrevet i fil"<<endl;
Jeg har lidt problemmer med at forstå alt det med class. Vi har skulle læse en bog der hedder "computing using c++ and object technology" med ford og topp, og jeg har læst meget i den, men jeg har stadig ikke forstået hvordan man bruger classer.
Bagefter kompilerer JEG med: bcc32 c:\cpp\bog.cpp og der kommer ikke nogle af de fejl du får, og fejlen var pga. using namespace std; der stod et forkert sted
PS!!! En noget rarere kompiler at arbejde med er Dev-C++ Download den fra www.bloodshed.net... Den nyeste beta virker helt fint, jeg har ihvert fald ikke fundet fejl endnu :) Alt det der kommandoprompt nusseri med BCC55 var da ihvertfald nok til at jeg var ved at blive skingrende sindsyg :))
gnyff >> Du laver så vidt jeg kan se det et par små fejl:
1) Når du definerer din variabel, dvs. den aktuelle "anvendelse" af din bog-klasse. #include "bog.h" // For at du kan bruge din nye bog-klasse. bog minBog();
2) Implementeringen af constructoren, setteren og getteren. Du skal sørge for at de variabler der bliver overført til funktionen, hedder noget andet end dem der bliver gemt i selve klassen - ellers kan compileren ikke skelne mellem dem. Ligeledes er syntaksen i definitionen af klassens memberfunktioner lidt forkert - skilletegnet er ':' (kolon), ikke '.' (punktum)
Hvad der allerede er blevet skrevet er : Du mangler din Constructor ! (Selvom du default får en Constructor, afhænger det af compileren)
Du benytter 2 metoder, som ingen returværdi har.. Jeg ved ikke om det er dem du betrager som din Default Constructor og overloadede Constructor.. I så fald skal de have samme navn som din klasse navn
OK, jeg fatter bare mindre og mindre af hvad der bliver skrevet.
Jeg har forstået at der er en hulens masse fejl, n uhar jeg lavet classer i 2 uger, men jeg har stadig ikke fået nogen af dem til at virke, er der ikke en af jer der gider foklare mig hvordan man laver en classe og komme med et godt forslag til hvordan jeg får løst in opgave???
Jeg går på c++ kursus fordi jeg gerne vil lære at programmere i c++, så der er nok nogen af jer der kommer til at tjene en masse point på mig.
cout<<"ISBN nummer (8 tal) : "; cin>>isbn; cout<<endl; if((isbnnummer[1]+isbnnummer[2]+isbnnummer[3]+isbnnummer[4]+isbnnummer[5]+isbnnummer[6]+isbnnummer[7]+isbnnummer[8]) == 44){ cout<<"Data skrevet i fil"<<endl;
* Navnene på dine variable er ikke stavet ens hele vejen igennem programmet * Du mikser lokale, globale og overførte parametre - disse skal have forskellige navne, hvis du vil bruge dem samtidigt. * Member funktioner må ikke defineres inde i andre funktioner * Variabler (herunder dine egne klasser) skal instatieres, før du kan bruge dem
int main(void) { bog *minBog = NULL; // HER ER DER ÆNDRET string tittle; // HER ER DER ÆNDRET string forfat; // HER ER DER ÆNDRET string forl; // HER ER DER ÆNDRET string udgar; // HER ER DER ÆNDRET int nudgar; // HER ER DER ÆNDRET string isbn; // HER ER DER ÆNDRET char valg; // HER ER DER ÆNDRET
do // LØKKE SÅ DU KAN INDTASTE OG DEREFTER VISE DIN INDTASTNING { cout << "\033[2J";
cout<<"Traef et valg: \n o = Opret \n t = Tjek\n a = Afslut\n"<<endl; cin>>valg;
switch (valg){ case 'o': cout<<"Bogens title : "; cin>>tittle; cout<<endl;
cout<<"ISBN nummer (8 tal) : "; cin>>isbn; cout<<endl;
// HER ER DER ÆNDRET if(bog::isbnkontrol(isbn)){ cout<<"Data skrevet i fil"<<endl;
nudgar = atoi(udgar.c_str()); // HER ER DER ÆNDRET if (minBog == NULL) // OPRETTES FØRSTE GANG minBog = new bog(tittle, forfat, forl, nudgar, isbn); else // INDHOLD ÆNDRES minBog->setData(tittle, forfat, forl, nudgar, isbn); }else{ cout<<"ISBN nummer er ikke sandt"<<endl; } break; case 't': if (minBog != NULL) { cout<<"titel : "<<minBog->getTitel()<<endl; cout<<"Forfatter : "<<minBog->getForfatter()<<endl; cout<<"Forlag : "<<minBog->getForlag()<<endl; cout<<"Udgivelsesaar : "<<minBog->getUdgivelsesaar()<<endl; cout<<"ISBN nummer : "<<minBog->getIsbn()<<endl; } else cout << "Bog ikke indtastet endnu." << endl; case 'a': break; default: cout<<"Du har ikke truffet noget valg!!!"<<endl; }; } while (valg != 'a');
// OPRYDNING if (minBog != NULL) delete minBog; return 0; } // Main
gnyff >> Forstår jeg ikke - mit eksempel ovenfor compilerer uden problemer i BCB, og fungerer. (For så vidt angår den relativ begrænsede funktionalitet.)
Hmmm, undeligt for jeg får hele tiden fejlmeldinger, og jeg vil gerne lære at bruge class.
Kan du ikke fortælle mig punkt for punkt hvordan man bruger class??? Hvornår skal man bruge :: hvornår skal man bruge -> og hvornår skal man bruge . (punktum)????
1) :: Skal du bruge når du definerer member-funktioner uden for selve klassedefinitionen. <et eller andet>:: angiver at der der står efter :: skal findes i/hører til klassen <et eller andet>
Man ser det sommetider (tit her på eksperten) brugt sammen med "flag" fra system-klasserne, f.eks.;
Std::endl i fbm. f.eks. cout << "Hello World" << Std::endl;
2) -> Dette skal du bruge hvis din variabel er en pointer, dvs. defineret <et eller andet> *Variabel, og "får" sin værdi vha. Variabel = &<Noget andet>, eller Variabel = new <Et eller andet>();
3) . Dette skal du bruge hvis din variabel er direkte instatieret, dvs. IKKE en pointer <Et eller andet> Variabel og "får" sin værdi med alm. assignment Variabel = 12; eller Variabel = <En anden variabel af samme type>
At forklare brugen af klasser, er udenfor hvad eksperten skal bruges til - så skal du søge en relevant bog i stedet. (Mange har stillet ? og hvor man kan finde sådanne bøger - prøv at søge på ordene 'bøger lærebog klasser classes' og se hvad der bliver fundet.)
gnyff >> Kig på mit eksempel lige ovenfor een gang til - alle de svar du søger, står der ! Klassen defineres i bog.h - de enkelte member funktioner i bog.cpp. Klassen variabler defineres (god latin/skik og brug) i enten private: eller protected: delen af din klasse, men public: delen indeholder både den egentlige funktioner på klassen, samt de såkaldte "getters" og "setters" der gør det muligt at få fast i eller ændre værdierne.
Det er IKKE god skik og brug, at man kan tilgå klassen interne variabler direkte som test.variabel, der skal man bruge "getters" og "setters" - bl.a. fordi du så kan ændre på måde de interne data gemmes, uden at du behøver at ændre resten af dit program. (Det kaldes indkapsling.)
Hvis du ikke kan finde svaret på dine spørgsmål ud fra ovenstående eksempel - SOM INGEN KOMPILERINGS FEJL GIVER !!! - så mener jeg stadig at du skal finde dig en brug om grundlæggende C++ og begrebet klasser, for at forklare det her på eksperten fører alt, alt for vidt.
OK, hvad for en compiler bruger du siden at jeg bliver ved med at få fejl???
Se jeg er begynder i c++, og jeg tager et kursus, som jeg ikke syntes er særligt godt. Til dettet kursus har jeg købt en bog ("Computing using c++ and object technoligy" med ford og topp) jeg har læst kapitel 4 igennem 7 gange og har stadig ikke forstået hvordan man laver en class. Derfor håbede jeg på at jeg kunne gå på eksperten, og få hjælp, og ikke en hulsens masse kompiseret kode og en hel masse henvisninger til den.
Hvis jeg laver en class som hedder test så skriver jeg
1) Jeg bruger Borland C++ Builder - du skal have en C++ compiler, for at kunne anvende klasser. (gcc f.eks. duer ikke - du skal bruge g++)
2) Det eksempel er helt galt. Du skal huske at klasse-defintioner og implementeringer af metoder INTET har at gøre med dit egentlige program. Dit eksempel skulle se sådan her ud (bemærk at det skal blive til TRE (3!) filer i dit bibl.):
class test { private: string a; string b; public: test(string va, string vb); string getTest(void); } #endif // TEST.H ikke allerede inkluderet een gang
// TEST.CPP #include "test.h" test::test(string va, string vb) { a = va; b = vb; } // constructor string test::getTest(void) { return a+" "+b; } // "Getter"
og så ser dit alm. hovedprogram sådan her ud
// MAIN.CPP #include <stdio.h> #include <conio.h>
#include "test.h" int main(void) { test minTest("Hej", "Gnyff");
Man *KAN* nøjes med een - med det er god skik og brug at lave 2 pr. klasse - en .h og en .cpp fil. Så kan du jo også bruge klassen i andre sammenhænge.
Den forstod jeg ikke helt, jeg prøvede at ændre min int main(){... til char main(){... men jeg får stadig fejl. Too many types in declaration Type 'test' may not be defined here Expression syntax in function main ) expected in function main
Gnyff >> Vær sød at kigge på den kode som er postet indtil flere gange ! Det er altså et fuldt ud fungerende eksempel ! Din main() har intet med "body" til member-funktionerne at gøre. Måske skulle du sænke dit ambitionsniveau lidt, og lære grundlæggende C først ?!? Hvis ovenstående bog ikke kan forklare brugen af klassen ordentligt, så smid den ud ! - Så svært er klasser altså heller ikke - grundlæggende er en klasse det samme som en struct !
Hvis ikke ovenstående kan hjælpe dig videre, er jeg bange for at jeg heller ikke rigtigt kan hjælpe dig.
OK, i får noget for hjælpen... selv om det ikke var til meget hjælp.
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.