c++ hjälp med en abstract class

Permalänk
Medlem

c++ hjälp med en abstract class

Tja, jag har lite problem med att hitta rätt...

Såhär är det, jag har en abstract class ( låt oss kalla den "Base") som jag lägger över en annan class ( den kallar vi "A") och när jag ska nå funktionen "GetWindow" i "A" så fattar jag inte/hittar inte rätt variabel när jag deklarera det så här i min "Main"

b *<namn> = new A();

och kallar på GetWindow() så här

<namn>->GetWindow()-><namn på funktion>

så här ser deklarationen ut i klasserna:

class A : public Base
{
private:
WINDOW * Window; <- En pointer till annan class
public:
WINDOW* GetWindow()
{return Window ? Window : (Window = new WINDOW());}
};

så hur kallar jag på GetWindow??

Tacksam för ett så kallat "Noob friendly answer"

EDIT:
Såhär blev det till slut...
static_cast<A*>(namn)->GetWindow()-><function>

Visa signatur

Intel pentium 3.0ghz @ 3.5ghz
ATI Radeon HD 3850
alltså en skräpdator...

Permalänk
Medlem

"och kallar på GetWindow() så här"
"så hur kallar jag på GetWindow??"
Vad är problemet?

Visa signatur

"Some poor, phoneless fool is probably sitting next to a waterfall somewhere, totally unaware of how angry and scared he's supposed to be." - Duncan Trussell

Permalänk
Medlem

Ledsen att jag var otydlig, Problemet är att den klagar på att det inte finns någon funktion som heter "GetWindow()" i class Base vilket jag också fattar för att funktionen ligger class "A"... och jag undrar hur jag ska göra för att nå funktionen "GetWindow()" då.

Visa signatur

Intel pentium 3.0ghz @ 3.5ghz
ATI Radeon HD 3850
alltså en skräpdator...

Permalänk
Medlem

Har inte kodat i C++, däremot antar jag att problemet är som följande. Eftersom typen på variabeln du skapar är "Base" så har du tillgång till allting som "Base" innehåller och inte mer. För att komma åt den så behöver du kanske deklarera funktionen i din "Base" klass och sedan skriva över den i din "A" klass (underlättar alltid med bra namn btw ).

Så jag beskrev det är hur det funkar i C# och jag antar att det funkar ungefär på samma sätt i C++

Edit: om du har tid så kika igenom denna sidan: http://www.cplusplus.com/doc/tutorial/polymorphism/ står precis vad du behöver veta (Läs under Virtual- och abstract-classes)

Visa signatur

In order to understand recursion, one must first understand recursion

Permalänk
Medlem
Skrivet av pkzlol:

Har inte kodat i C++, däremot antar jag att problemet är som följande. Eftersom typen på variabeln du skapar är "Base" så har du tillgång till allting som "Base" innehåller och inte mer. För att komma åt den så behöver du kanske deklarera funktionen i din "Base" klass och sedan skriva över den i din "A" klass (underlättar alltid med bra namn btw ).

Så jag beskrev det är hur det funkar i C# och jag antar att det funkar ungefär på samma sätt i C++

Edit: om du har tid så kika igenom denna sidan: http://www.cplusplus.com/doc/tutorial/polymorphism/ står precis vad du behöver veta (Läs under Virtual- och abstract-classes)

Det är precis den sidan jag har lärt mig från Problemet är att jag vill inte ha funktionen "GetWindow" i classen Base för att "A" är den enda som ska ha tillgång till "GetWindow" eller WINDOW classen i huvud taget (Base kommer att användas på många andra klasser). Men, men, jag får väll prova mig fram...kanske det bara är g++ compilern som bråkar.

Visa signatur

Intel pentium 3.0ghz @ 3.5ghz
ATI Radeon HD 3850
alltså en skräpdator...

Permalänk
Medlem

Som du kanske insett nu lägger du alltså till

WINDOW* GetWindow()=0;

i din Base-klass, annars kommer du omöjligt kunna kalla på denna när du håller i pekare till Base. Du kan däremot omvandla pekaren till en A*, dvs

static_cast<A*>(a)->GetWindow()->etc

men då måste du såklart vara säker på att a (din Base*) verkligen pekar på en instans av A och inte någon annan klass som ärver från Base. Alternativt kan du använda dynamic_cast

A* aa = dynamic_cast<A*>(a); if(aa) aa->GetWindow()->etc

men det låter som att du nog bör tänka om dina design-val hellre än att göra på dessa vis.

Visa signatur

"Some poor, phoneless fool is probably sitting next to a waterfall somewhere, totally unaware of how angry and scared he's supposed to be." - Duncan Trussell

Permalänk
Hedersmedlem

Konvertera pekaren till en A* innan du anropar funktionen.

Permalänk
Medlem

class A : public Base { private: WINDOW * Window; <- En pointer till annan class public: WINDOW* GetWindow() {return Window ? Window : (Window = new WINDOW());} };

För att få den funktionen ifrån A, måste du casta om med dynamic cast. dynamic_cast<A*>(namn).getWindow();

Annars kan du lösa problemet om du använder virtuella funktioner.
så här:

class Base { private: - - public: Base(); virtual WINDOW* GetWindow()=0; };

med en virtuell funktion så kommer den automatiskt förstå att du behöver A,s GetWindows();. Om jag inte minns fel kallas detta för Dynamisk Binding.
Om du inte vill ha funktionen i basklassen utan funktions kropp, kan du göra detta också,

virtual WINDOW* GetWindow() { return dosomething; }

(Det är starkt rekommenderat att använda virtuella destructorer i ett arv system)

lycka till!

Visa signatur

OS: Win7 x64, GPU: Geforce Gigabyte GTX580 SOC
CPU: Intel i5 2500k (4.5gHz), MB: Asus P8P65 PRO Rev(3.1),
PSU: XFX 750w (modular), RAM: 2x Crosair Vengence 1600mz 4024mb
Cooling: CoolIT ECO A.L.C CPU COOLER
Chassi: Raven rv03

Permalänk
Medlem

Tack så mycket för hjälpen!
skriver vilket svar jag använde där uppe....

Visa signatur

Intel pentium 3.0ghz @ 3.5ghz
ATI Radeon HD 3850
alltså en skräpdator...