Class protection?

Tags:    c++

Hej.
Jeg har et problem med Class protection.

Eksempel på mit problem:

tv.h
Fold kodeboks ind/udKode 


Denne klasse er nu oprettet og den eneste vej, jeg kan ændrer i kanal, er igennem setKanal(int) korrekt?

Næste klasse

fjernbetjening.h
Fold kodeboks ind/udKode 


Denne klasse har via en pointer adgang til public funktioner i Tv korrekt?

Tv.cpp
Fold kodeboks ind/udKode 


fjernbetjening.cpp
Fold kodeboks ind/udKode 


main.cpp
Fold kodeboks ind/udKode 




Nu er mit spørgsmål. Dette stykke kode vil køre således:

Den opretter et objekt af klassen fjernbetjening og kalder metoden run

i run, vil den kalde nyKanal i klassen Tv via tvPtr, som giver adgang til klassen Tv.

kanal vil efter denne rutine få værdien 2?

Jeg har uladt constructor osv. i ovenstående eksempel, da disse ikke giver relevans for eksemplet.

Jeg får ingen fejl i det kode jeg compiler (ikke samme kode, blot et eksempel på sammenspil mellem klasser), men når den når til mit sammenspil mellem 2 klasser, som i eksemplet tvPtr->setKanal(2);

Så melder den en kritisk fejl og stopper programmet. Jeg har fundet ud af, det ikke er selve kaldet, men i linjen hvor jeg skriver til variablen jeg tilgår gennem min pointer. Altså vil den melde fejl ved kodelinjen
kanal = skiftkanal;

Kan dette være rigtigt?








8 svar postet i denne tråd vises herunder
2 indlæg har modtaget i alt 8 karma
Sorter efter stemmer Sorter efter dato
Jeg har godt nok også haft mange problemener med klasser og poly her for tiden.. :)
Har du husket at inkludere fx tv.h i fjernbetjening.h? Og du kan evt. lave en forward decleration i fjernbetjening.h altså:
class Tv;

Og se om klassen overhovedet bliver loadet korrekt.



nu har du jo udeladt konstrukturen, men kritisk fejl som compileren ikke opdager er som regel access til uinstantieret ting så har du husket faktisk at sætte din Tv pointer til at pege på et object af Tv klassen?



->Jakob: Ja, alle filer er inkluderet. Klasse bliver loadet, fordi jeg kan godt bruge funktionerne, jeg kan bare ikke skrive til/læse variablerne.

->Nørden: Min pointer fungere jo som et objekt af klassen. Ellers ville jeg ikke kunne kalde en metode af Tv. Men i så fald. Hvorfor ville du få den til at pege på et objekt i Tv?



->Jakob: Ja, alle filer er inkluderet. Klasse bliver loadet, fordi jeg kan godt bruge funktionerne, jeg kan bare ikke skrive til/læse variablerne.

->Nørden: Min pointer fungere jo som et objekt af klassen. Ellers ville jeg ikke kunne kalde en metode af Tv. Men i så fald. Hvorfor ville du få den til at pege på et objekt i Tv?


En pointer peger ikke på noget (fornuftigt) før du initialiserer den, så det skal du gøre først.

Tv * ptr = new Tv;

F.eks. i constructoren :)



Hmm... Nu har jeg for at teste det, lavet smidt det kode i første indlæg ind i min compiler (Microsoft Visual Studio), og lavet en constructor.

Tv.h
Fold kodeboks ind/udKode 


Tv.cpp
Fold kodeboks ind/udKode 


Fjernbetjening.h
Fold kodeboks ind/udKode 


Fjernbetjening.cpp
Fold kodeboks ind/udKode 


main.cpp
Fold kodeboks ind/udKode 


Koden compiler, men så snart jeg trykker enter efter at have indtastet en ny kanal, melder den fejl. Jeg ved det sker i Tv.cpp ved koden kanal = nykanal;

Hvorfor det sker ved jeg endnu ikke. Efter at have skrevet Tv * tvPtr = new Tv; peger den nu på Tv klassen ikke sandt? Er der nogen der kan se en fejl i noget af det?



Fold kodeboks ind/udKode 


Her laver du en lokal variabel i constructoren. Du bruger ikke membervariablen.

Gør istedet følgende:
Fold kodeboks ind/udKode 


...og husk en destructor som befrier hukommelsen igen.

Forøvrigt så er arkitekturen måske lidt forkert. Fjernbetjeningen burde nok snarere høre til TV'et i stedet. Du går jo ikke ned og køber en fjernbetjening og får et TV med i købet.



Hvis jeg skriver dette i min constructor
Fold kodeboks ind/udKode 


Har så oprettet en print metode i class Tv, som blot udskriver attributten kanal;

dette kan godt lade sig gøre, men så snart jeg gør det udenfor constructoren, og får igennem en Fjernbetjenings metode, så virker det ikke...?


Edit:

Arh, ja selvfølgelige! Tusind tak Robert Larsen. Derfor mit nyeste eksempel virkede. Nu virker det også.

Ja, det har du ret i, men dette kode eksempel var også blot lavet på 1 min. Det var blot for at vise hvad mit problem var, og ikke selve den kode jeg er ved at skrive. De har intet med hinanden at gøre, ud over sammenspil mellem klasserne.

Jeg siger mange tak til alle jer, som har givet jeres bud på, hvad kunne løse problemet.

Robert, hvis du ligger et svar, så får du tildelt pointene



Indlæg senest redigeret d. 28.11.2008 13:48 af Bruger #12393
Godt at du fik det til at virke.

Jeg samler ikke på points, så behold dem bare.



t