Avatar billede tesd Nybegynder
17. marts 2003 - 09:55 Der er 6 kommentarer og
1 løsning

Oprettelse af pure virtuel objekt og brug af dennes adresse

Jeg sidder med et problem. Min pure virtuelle class, ser således ud.
klassen hedder MSdpAgentNotifier, og har funktionerne.
virtual void AttributeRequestComplete(TSdpServRecordHandle aHandle, TInt aError) = 0;

virtual void AttributeRequestResult(TSdpServRecordHandle aHandle, TSdpAttributeID aAttrID, CSdpAttrValue* aAttrValue) = 0;

virtual void NextRecordRequestComplete(TInt aError, TSdpServRecordHandle aHandle, TInt aTotalRecordsCount) = 0

Jeg laver en klasse der arver fra MSdpAgentNotifier, og derved skal jeg jo implimentere de tre funktioner. Dette er udført.

Jeg skal nu oprette et objekt af typen MSdpAgentNotifier, og dette kan jo ikke lade sig gøre.
MSdpAgentNotifier skal oprettes fordi denne funktion skal bruge denne.

static CSdpAgent* NewLC(MSdpAgentNotifier& aNotifier, const TBTDevAddr& aDevAddr);

jeg kan godt se at dette er en adresse, men jeg kan jo ikke oprette et MSdpAgentNotifier objekt. Jeg opretter så en adresse til et MSdpAgentNotifier objekt.

MSdpAgentNotifier &rcvr
Men dette virker jo heller ikke, der skal jo noget ind i dette objekt. Detter er det objekt der arver fra MSdpAgentNotifier, i mit til fælde hedder dette objekt test.
test rcvr2;

Så er problemet så hvordan kan dette lade sig gøre at min funktion skal kunne modtage mit test objekt, men som et MSdpAgentNotifier & objekt.

Håber der er nogen der kan hjælpe.
Avatar billede arne_v Ekspert
17. marts 2003 - 10:02 #1
Jeg er ikke helt sikke rpå at jeg forstår problemet.

Du kan ikke instantiere en klasse med abstrakte (virtual .. = 0)
metoder.

Du kan godt instantiere en af de klasser der arver fra klassen.

Så noget i retning af:

MSdpAgentNotifier man = new MSdpAgentNotifierImpl();
Avatar billede arne_v Ekspert
17. marts 2003 - 10:04 #2
Iøvrigt kan du godt kalde NewLC direkte med et objekt af typen
MSdpAgentNotifierImpl, da det jo arver fra MSdpAgentNotifier som er
i erklæringen.
Avatar billede tesd Nybegynder
17. marts 2003 - 10:11 #3
MSdpAgentNotifier man = new MSdpAgentNotifierImpl();
kan ikke lade sig gøre.
Kompiler:
.\\Testbt.cpp:176: cannot declare variable `rcvr' to be of type `MSdpAgentNotifier'
.\\Testbt.cpp:176:  since the following virtual functions are abstract:
.\\Testbt.cpp:176:      void MSdpAgentNotifier::AttributeRequestComplete(TSdpServRecordHandle, TInt)
.\\Testbt.cpp:176:      void MSdpAgentNotifier::AttributeRequestResult(TSdpServRecordHandle, TSdpAttributeID, class CSdpAttrValue *)
.\\Testbt.cpp:176:      void MSdpAgentNotifier::NextRecordRequestComplete(TInt, TSdpServRecordHandle, TInt)
Avatar billede tesd Nybegynder
17. marts 2003 - 10:11 #4
rcvr=MSdpAgentNotifier objekt
Avatar billede tesd Nybegynder
17. marts 2003 - 10:14 #5
Man kan kun oprette MSdpAgentNotifier &man eller MSdpAgentNotifier *man
Da denne er virtuel. Så skal man have fat i adressen, på denne pointer eller objekt adresse, og fylde arv objektet ind der. Ik????
Avatar billede arne_v Ekspert
17. marts 2003 - 10:37 #6
Hvis MSdpAgentNotifierImpl implementerer de 3 virtuelle metoder
i MSdpAgentNotifier, så skal du kunne lave en:

MSdpAgentNotifier man = new MSdpAgentNotifierImpl();
Avatar billede tesd Nybegynder
17. marts 2003 - 10:39 #7
jepper det var fordi funktionerne ikke var deklereret virtuelle i klassen der arver fra MSdpAgentNotifier .
Tak for hjælpen.
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