Avatar billede T101 Novice
03. juni 2003 - 18:38 Der er 15 kommentarer og
2 løsninger

Programerings eksamen i C++

Jeg står netop nu (som mange andre nok) med en eksamen i programering om omkring en uge, og jeg sidder og er flittig med næsen i bøgerne. Nu er det bare sådan at jeg nogen gange godt kunne bruge lidt ektra hjælp med visse ting, så derfor har jeg åbnet dette spørgsmål hvor jeg håber nogen kan hjælpe mig i løbet af den næste uge?

Jeg udloder maximum point (200) som vil blive delt med dem der kan hjælpe.

Første spørgsmål:

Polymorphi: Jeg har lidt problemer med abstrakte klasser og 'pure virtual functions'. Så vidt jeg kan forstå er en abstrakt klasse en klasse der indeholder en 'pure virtual function' som er en funktion der bliver sat til 0. Denne funktion kan så bruges i klasser der nedarver fra den abstrakte klasse, hvor den implementeres. Nogen tilføjelser, rettelser eller uddybelse af dette?
Avatar billede arne_v Ekspert
03. juni 2003 - 18:46 #1
En abstrakt klasse er en klasse der indeholder mindst en pure virtual
method.

Den kan derfor ikke instantieres (man kan ikek lave et objekt af den type).

Man kan kun extende klassen og instantiere objekter af de afledte klasser
som har implementeret metoderne.
Avatar billede arne_v Ekspert
03. juni 2003 - 18:47 #2
Den pure virtual metode kan bruges i klassen selv (fordi man kan være
sikker på at når der et instantieret objekt så er der også en
implementation af metoden) og af de afledte klasser.
Avatar billede segmose Nybegynder
04. juni 2003 - 09:39 #3
Når du bruger polymorphi så husk at lave din destructor virtuel ellers så kan du få problemer med nedarvede klasser der egentlig skulle have kaldt deres destructor ikke får det da kun base klassen's kaldes.

int main() {
  Base *b = new Derived;
  delete b;
  return 0;
}

Bemærk også at visual C++ åbenbart ikke overholde den af arne beskrevne begrændsning, da jeg har set indtil flere gang "pure virtual function called" i visual C++ hvilket så skulle gøre den til en ikke standard compiler.
Avatar billede arne_v Ekspert
04. juni 2003 - 09:51 #4
1)  Jeg formoder at der sker noget ret grimt så. En pure virtual
    method er jo reelt en function pointer med værdi NULL.

2)  Hvordan pokker får du instantieret sådan et objekt ?

    Compileren bør da give fejl på det !?
Avatar billede segmose Nybegynder
04. juni 2003 - 10:02 #5
Ja netop, jeg kan ikke tænke mig et scenario hvor det skulle kunne forekomme, men de der popop er ret overbevisende, og jeg er ikke den eneste der har set det.
Det lader til at compileren genererer en funktion der kaldes for alle pure funktioner, men det er stadig forkert.
Avatar billede arne_v Ekspert
04. juni 2003 - 10:16 #6
Jeg læste lige lidt på nettet.

Og fandt følgende måde:

class A {
  public:
      A() { f(*this); };
      virtual void vf() = 0;
      void f(A& a) { a.vf(); };
};

class C : public A {
  public:
      virtual void vf() { };
};

int main()
{
  C *c = new C();
  return 0;
}

which with mingw gives the following output:
  pure virtual method called
  abnormal program termination

Og folk der bruger this i en constructor bør slåes i hovedet med en
tung økse !
Avatar billede segmose Nybegynder
04. juni 2003 - 13:50 #7
Og du får slet ingen warnings?
Avatar billede arne_v Ekspert
04. juni 2003 - 13:58 #8
No.

Ikke med mingw (GCC). Jeg kan prøve med VC++ og BCB senere.
Avatar billede arne_v Ekspert
04. juni 2003 - 19:34 #9
C:\>g++ --version oops.cpp -o oops.exe
g++ (GCC) 3.1
Copyright (C) 2002 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.


C:\>oops
pure virtual method called

abnormal program termination

C:\>cl oops.cpp
Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 12.00.8804 for 80x86
Copyright (C) Microsoft Corp 1984-1998. All rights reserved.

oops.cpp
Microsoft (R) Incremental Linker Version 6.00.8447
Copyright (C) Microsoft Corp 1992-1998. All rights reserved.

/out:oops.exe
oops.obj

C:\>oops

runtime error R6025
- pure virtual function call

C:\>bcc32 oops.cpp
Borland C++ 5.5 for Win32 Copyright (c) 1993, 2000 Borland
oops.cpp:
Warning W8004 oops.cpp 17: 'c' is assigned a value that is never used in functio
n main()
Turbo Incremental Link 5.00 Copyright (c) 1997, 2000 Borland

C:\>oops

Pure virtual function called
Avatar billede arne_v Ekspert
04. juni 2003 - 19:35 #10
De er forbløffende enige om at lade sig narre.

t101>

Du skal bare ignorere denne her lille tråd.

Det er ikke meneingen at man skal kunen kalde pure virtual metoder
som ikke er implementeret.

Det her viser bare at vi kan snyde compilerne.
Avatar billede janomel Nybegynder
04. juni 2003 - 19:37 #11
Held og lykke med eksamen er med for at lære
Avatar billede T101 Novice
05. juni 2003 - 02:43 #12
Det ser ellers meget interresant ud og hvis jeg kunne forstå det lidt bedre ville det nok give en god karakter :)

Men indtil videre har jeg lidt bedre styr på abstrakte klasser ...

Ville dog lige høre om i kunne komme med en fordel ved at bruge dem?
Avatar billede arne_v Ekspert
05. juni 2003 - 11:26 #13
En abstrake klasse er en god til at putte en masse funktionalitet
som kun mangler en lille smule konkrete funktionalitet men hvor
man alligevel skal bruge den lille smule konkrete funktionalitet.

Man ser tit en abstrakt klasse med en masse logik og nogle
få pure virtual methods getName, getSize etc. og så kan man
lave klasser der arver fra den implementerer disse simple metoder
og så har man noget der kan bruges.

Også set er abstrakte klasser med ene abstrakte metoder for at
lave det man i Java kender som et interface. Slet ingen
funktionalitet kun en kontrakt om interface.
Avatar billede segmose Nybegynder
06. juni 2003 - 10:15 #14
Polymorfi fx. en base klasse geo der har en pure areal function og diverser derived fx. kvadrat, cirkel der så implementerer deres egen areal function, nu kunne du have en liste med geo objecter der enten er kvadrat eller cirkel så kan du fx. lave

FORALLE(totalAreal += geoObj->areal);

eller du kunne lave noget fælles (re-)store hvor hver derived skulle implementere lidt selv men du ikke vil have en konkret classe til at gøre det, fx. fordi der er en minimum størrelse for instancer af classer selvom de ikke har noget data/virtuelle funktioner dette gælder også når de arves af andre classer (grrrr.).
Avatar billede T101 Novice
07. juni 2003 - 04:17 #15
Så er jeg tilbage. Sidder og læser lister lige nu. Hvilke metoder findes der for at implementere en ADT liste. Har allered array og linked list. Tæller 'array of pointers' som en anden implementering end et array? Og hvilken implementering tror i jeg ville få mest ud af at gennemgå som eksempel?

Fik jeg forresten sagt at det er en mundlig eksamen?

Ps. Tak for indlæg ind til videre.
Avatar billede arne_v Ekspert
07. juni 2003 - 10:27 #16
Konstruktioner a la:

X **x = new X[n];
for(int i = 0; i < n; i++) x[i] = new X(a[i]);

ses hyppigt.

Men det er jo ikke en abstrakt data type.

Du kunne vel godt lave en klasse som havde et array af pointere
til void og gemme forskelligt i den.

Har dog aldrig selv brugt konstruktionen.

Er du opmærksom på STL vector ?
Avatar billede T101 Novice
12. juni 2003 - 17:31 #17
Ja så har jeg været til eksammen. Fik et 8 tal så det er sådan ok. Kom op i binære træer. Tak for hjælpen med de 'uklare' punkter.
Avatar billede Ny bruger Nybegynder

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.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester