/ Forside / Teknologi / Udvikling / C/C++ / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
C/C++
#NavnPoint
BertelBra.. 2425
pmbruun 695
Master_of.. 501
jdjespers.. 500
kyllekylle 500
Bech_bb 500
scootergr.. 300
gibson 300
molokyle 287
10  strarup 270
Meget underligt problem (synes jeg)
Fra : Socketd


Dato : 05-08-03 14:48

Jeg havde et meget underligt problem, som jeg håber nogen herinde kan
forklare.

Jeg er ved at skrive et program til kæresten og er derfor for første
gang i mit liv, gået igang med at skrive en GUI (wxWindows). Eftersom
det er første gang har jeg lidt svært ved at overskue hvordan, jeg skal
sætte gui'en sammen (kodemæssigt), så koden er ikke optimal eller
logisk, men håber I forstår hvad jeg mener:

Jeg har en AktivOrdre side som oprettes med:
AktiveOrdre(wxWindow* parent, wxWindowID id = -1,
      const wxPoint& pos = wxDefaultPosition,
      const wxSize& size = wxDefaultSize,
      long style = wxTAB_TRAVERSAL, const wxString& name = "Aktive
Ordre", Funktioner *f = 0);

"Funtioner *db", som er private i AktiveOrdre, bliver sat = f.

Jeg havde så oprettet et objekt af AktiveOrdre med:
new AktiveOrdre(muligheder, -1);

Det vil så sige at db = 0 ikke? Godt, så har jeg en:
int AktiveOrdre::indlaes() {
   fundet.clear();
   db->getAktiveOrdrer(&fundet);
   //snip
}

Her glemmer jeg at checke om db = 0, men alligevel virket kaldet (sådan
da). Jeg kom ind i getAktiveOrdrer og kunne oprette variable og endda
udskrive til skærmen derfra. Men lige så snart jeg prøvede at bruge en
af db's variable (altså dem der er private/protected/public) fik jeg en
Segmentation fault (core dumped).

Jeg kan for det første ikke forstå hvordan db->getAktiveOrdrer(&fundet)
kan virke når db nu er = 0. Derefter kan jeg ikke forstå, hvorfor det så
kun virker halvt?

Koden har virket (med db = 0) indtil jeg lavede til om på
AktiveOrdre::indlaes(). Så lige pludselig virkede
Funktioner::getAktiveOrdrer ikke længere hvilket jo ikke gav nogen
mening, men det gør ovenstånende vel heller ikke?!?!

mvh
socketd

 
 
Bertel Brander (05-08-2003)
Kommentar
Fra : Bertel Brander


Dato : 05-08-03 19:16

Socketd wrote:
> Jeg havde et meget underligt problem, som jeg håber nogen herinde kan
> forklare.
[...]
>
> Det vil så sige at db = 0 ikke? Godt, så har jeg en:
> int AktiveOrdre::indlaes() {
>    fundet.clear();
>    db->getAktiveOrdrer(&fundet);
>    //snip
> }
>
> Her glemmer jeg at checke om db = 0, men alligevel virket kaldet (sådan
> da). Jeg kom ind i getAktiveOrdrer og kunne oprette variable og endda
> udskrive til skærmen derfra. Men lige så snart jeg prøvede at bruge en
> af db's variable (altså dem der er private/protected/public) fik jeg en
> Segmentation fault (core dumped).
>
> Jeg kan for det første ikke forstå hvordan db->getAktiveOrdrer(&fundet)
> kan virke når db nu er = 0. Derefter kan jeg ikke forstå, hvorfor det så
> kun virker halvt?
>
> Koden har virket (med db = 0) indtil jeg lavede til om på
> AktiveOrdre::indlaes(). Så lige pludselig virkede
> Funktioner::getAktiveOrdrer ikke længere hvilket jo ikke gav nogen
> mening, men det gør ovenstånende vel heller ikke?!?!

Uden at ville påstå at jeg forstår de finere detaljer vil jeg
forsøge med en forklaring.

Jeg forstår udemærket din undren, hvorfor virker:
class->member_func(), når class->member_var = 123 ikke
virker, hvis class er 0.
Det gør den fordi man ikke behøver et objekt af typen class
for at kalde en funktion i class'en class, funktionen er blot
en almindelig funktion (som en c funktion) der tilfældigvis
har en link til et objekt (this). Hvis objektet ikke eksisterer
(this er 0) går det galt når man forsøger at bruge objektet.

Man kunne tro at member funktioner i en class blev kaldt igennem
en pointer, det er ikke tilfældet.

En class kan have static member funktioner, det er altid lovligt
at kalde disse uden at have et objekt:

class MyMath
{
public:
static double GetPI();
};

double var = MyMath::GetPI();

Ulempen er at en static funktion i en class kun kan have access til
andre static member's af class'en.

Normalt er det en fejl at kalde normale member funktioner uden et
objekt, hvis det er OK at gøre det, kunne funktionen være static.

For virtual funktioner stiller det sig lidt anderledes, disse kaldes
normalt gennem et array af pointers i objektet, så dem kan man normalt
ikke kalde uden at have et objekt.


HTH

/b


Igor V. Rafienko (05-08-2003)
Kommentar
Fra : Igor V. Rafienko


Dato : 05-08-03 20:03

[ Bertel Brander ]

[ ... ]

> For virtual funktioner stiller det sig lidt anderledes, disse kaldes
> normalt gennem et array af pointers i objektet, så dem kan man
> normalt ikke kalde uden at have et objekt.


.... gjennom en array av pekere i _klassen_, ikke i objektet. Ellers
ville minnebehovene vært veldig store (dog, hvert objekt må på en
eller annen måte registrere sin klassetilhørighet, og det vil typisk
være en peker). Dog, objektet trenger man samme hva.

Men alt dette er bare implementasjonsdetaljer. En digresjon, altså.





ivr
--
<html><form><input type crash></form></html>

Socketd (05-08-2003)
Kommentar
Fra : Socketd


Dato : 05-08-03 19:40

On Tue, 05 Aug 2003 20:15:50 +0200
Bertel Brander <bertel@post4.tele.dk> wrote:

> Uden at ville påstå at jeg forstår de finere detaljer vil jeg
> forsøge med en forklaring.
>
> Jeg forstår udemærket din undren, hvorfor virker:
> class->member_func(), når class->member_var = 123 ikke
> virker, hvis class er 0.
> Det gør den fordi man ikke behøver et objekt af typen class
> for at kalde en funktion i class'en class, funktionen er blot
> en almindelig funktion (som en c funktion) der tilfældigvis
> har en link til et objekt (this). Hvis objektet ikke eksisterer
> (this er 0) går det galt når man forsøger at bruge objektet.

Aha, det vil sige at jeg kalder funktionen, men lige så snart den vil
have adgang til noget der tilhører et bestemt objekt fejler den, fordi
jeg ikke har angivet objektet rigtigt (altså objektet var = 0)?

mvh
socketd

Socketd (05-08-2003)
Kommentar
Fra : Socketd


Dato : 05-08-03 20:12

On Tue, 05 Aug 2003 21:02:17 +0200
Bertel Brander <bertel@post4.tele.dk> wrote:

> > Aha, det vil sige at jeg kalder funktionen, men lige så snart den
> > vil have adgang til noget der tilhører et bestemt objekt fejler den,
> > fordi jeg ikke har angivet objektet rigtigt (altså objektet var =
> > 0)?
> >
> Ja.

Ok, takker

mvh
socketd

Søg
Reklame
Statistik
Spørgsmål : 177558
Tips : 31968
Nyheder : 719565
Indlæg : 6408924
Brugere : 218888

Månedens bedste
Årets bedste
Sidste års bedste