'
Innlevering jeg sliter med(klasser og objekter)
Hei, Jeg har fått en innlevering (går forøvrig første året på NTNU i gjøvik) som jeg sliter med. Oppgaven er som følger:
Sitat:
Kode:
Topp toppene[MAXTOPPER + 1]; // Array med Topp-objekter. Kode:
void skrivTopper() { // Skriver ALLE toppene: Kode:
Error (active) E0135 class "Topp" has no member "toppene" |
Nå er ikke jeg så kjent med C, men det ser ut som du henter ut maks størrelse på arrayet på feil måte. Maxtopper som du deklarerer arrayet med, er kanskje ikke tilgjengelig når det kjøres. (Skal det være cout eller count i linje 3?) Anbefaler å deklarere Maxtopper som en egen variabel og bruk den direkte, eller finn funksjonen som returnerer arrayets størrelse. Sånn ville jeg gjort det i Delphi iallefall. Som sagt, jeg kan være helt på vidda. (Finnmarksvidda. Hehe!)
Du får sikkert bedre svar senere i dag. |
MAXTOPPER er bare en konstant jeg har deklarert tidligere i programmet, glemte helt å legge til det hehe. Er nok ingen av de tingene som er problemet dessverre, får bare google meg litt rundt til jeg finner ut av det selv eller noen her kommer med noen innspill.
|
Kanskje du kan legge ut hele koden din? Det er litt lettere å finne en feil i en kode hvis man har konteksten.
|
Kode:
#include <fstream> // ifstream, ofstream |
Så bare veldig kjapt på dette, så mulig det er feil, men du skal vel skrive ut med "cout << toppene[top]" og ikke "cout << Topp::toppene[top]. toppene er jo en global variabel og ikke en medlem av klassen Topp som feilmeldingen sier.
|
Ja har prøvd dette også, men da får jeg en annen error kode, kan forsåvidt legge ved denne også.
Error (active) E0349 no operator "<<" matches these operands Jeg googlet litt og prøvde å inkludere <string> i tillegg til <cstring> men det gjorde ingen forskjell |
Regner med at det er fordi du prøver å skrive ut et topp objekt direkte, uten at cout vet hva som skal skrives ut. Antar du skal skrive ut navnet på toppene, da blir det i såfall "cout << toppene[top].skrivNavn()", så må du fylle ut koden i skrivNavn() også.
|
Her var det mye dårlig praksis. Siden dette er et eksempel fra læreren din, så antar jeg at han har bakgrunn fra C og har lært seg C++ uten å sette seg ordentlig inn i det.
Det du prøver å skrive ut i 'void skrivTopper()' funksjonen er klassen selv. Dette hadde fungert om du har en statisk konstant variabel med navn 'toppene' på innsiden av klassen topp, som er en array. Men utfra oppgaven å tolke, så ønsker du å skrive ut navnet på toppene fra 'Topp' instansene 'toppene'. Men siden 'navn' er deklarert som en 'private' klasse attribute på innsiden av klassen 'Topp', så må du implementere 'Topp::skrivNavn()' metoden først. Kode:
void Topp::skrivNavn() Kode:
void skrivTopper() { // Skriver ALLE toppene: I tillegg så virker det litt som han har missforstått prinsippen med OOP (Objekt Orientert Programmering) og ansvar området til de enkelte metodene. Blant annet så har han deklarert «les» og «skriv» metoder fra std(in/out) og filer inn i både klasssen Topp og Etappe. Det hadde vært en mye bedre praksis å implementere «getters» og «setter» i disse klassene og heller laget eksterne funksjoner eller eksterne klasser til å ta seg av jobben med å fylle opp og skrive ut data fra disse. |
Har fått med meg at læreren ikke er helt med, han er dårlig til å formulere oppgaver og forelesningene hans er generelt sett dårlige. Må jo bare ta det som en lærerik opplevelse og heller lære meg de litt "bedre" praksisene på egen hånd, takk for svar skal prøve ut dette nå! Et kvikt spørsmål bare, "this ->" har jeg sett tidligere, men forstår ikke helt hva den gjør. Fungerer den slik at den alltid vil bruke det klasseobjektet som blir benyttet for øyeblikket slik at man slipper å bytte om dette?
ville for eksempel noe slikt være mulig? Kode:
void Topp::skriv() { // Skriver ALLE data: |
Sitat:
Grunnen til at jeg sier bunnen er fordi når koden din blir kompilert, så vil det som oftest (jeg kan ikke si alltid, siden det finnes rimelig mange minne/CPU arkitekturer og systemer i verden) føre til at «starten» av klassen din ligger på et lavere minne adresse en egenskapene og metodene i klassen gjør. Hvis du ser på eksemplet under: Kode:
#include <cstdlib> Kode:
&(this -> a) - this = 0 |
Sitat:
Generelt vil Kode:
MittObjekt->ObjektMetode(); Kode:
(*MittObjekt).ObjektMetode(); |
Takk, det var en nyttig ting å vite! Skal prøve å jobbe meg videre i oppgavene nå, så kommer jeg tilbake hvis det er noe mer jeg lurer på !
Er nå på en ny oppgave: Sitat:
EDIT: Da fant jeg ut at jeg bare kan bruke samme "oppsett" som på nyEtappe som er ferdiglagd av læreren, så det var vel ikke så vanskelig hehe. |
Sitat:
Men som tidligere sagt, så er dette en idiotisk måte å gjøre det på. Rå arrayer tilhører en tid der C var «the shit». I C++ så behandles disse mye bedre og enklere ved å bruke template kontainere som std::array, std::list, std::vector o.l. I ditt tilfelle så hadde det vært perfekt å bruke en dynamisk allokert template kontainer som std::vector. Kode:
#include <cstdlib> Kode:
Størrelsen av foo: 3 Men det kan godt tenkes at læreren deres ønsker at dere skal lære å håndtere rå arrays, jeg gjør deg bare oppmerksom på at det finnes mer sofistikerte og effektive måter å gjøre det på. |
EDIT2: Jeg sitter litt fast, har følgende kode:
Kode:
void nyTopp() { // Legger inn en ny topp: Kode:
void Topp::lesData(char nvn[]) { // Leser alle egne data: |
Sitat:
|
Sitat:
Sitat:
Sitat:
Om du bruker THIS (altså pekere) i oppgaven din, vil den sannsynligvis ikke bli godkjent. Ser at du sliter med veldig mye her ellers. Du bør følge bedre med i timene samt bruke tid på "hands-on". Det vil nok bidra til utviklingen mer enn å si at læreren er dårlig fordi du ikke forstår. Det er forøvrig universitet; det meste skal du lære på egenhånd. Sitat:
|
Ok, klarte å få det til slikleis:
Kode:
void Topp::lesData(char nvn[]) { Kode:
void nyTopp() { // Legger inn en ny topp: Sitat:
Kode:
for (int i = 0; i < (sizeof(toppene) / sizeof(toppene[0])); i++) { Dette er forøvrig hele funksjonen jeg har så langt: Kode:
void Etappe::lesData() { |
Sitat:
Sitat:
Sitat:
|
Sitat:
|
Eg går samme linje, og er nå på siste året. Det eg anbefaler trådstarter er å lese bloggen til Bjarne Stroustrup, og flittig bruk av cppreference og C++CoreGuidelines. Da får du ein ide om kva C++ er. Kan vere ubehagelig å møte opp på eit C++ intervju og vise fram noko slikt. Skaff deg gjerne ei bok om OOD (Object Oriented Design) mens du først er i gang.
Om ingen nye regler har kommet (som det gjerne ikkje har siden 1990-tallet) så tillater ikkje lektor bruk av STL, med mindre unntak står skrevet/oppgitt i timen. Unntakene er bibliotek for lesing og skriving til filer. Vi klarte å klore oss til `std::string` noko dere burde gjer om dette fortsatt ikkje er "innafor". |
Alle tidspunkt er GMT +2. Klokken er nå 15:59. |