Return Class parameter virtual funktion.

Permalänk

Return Class parameter virtual funktion.

Ja bara skriva den rubriken fick mitt huvud att vilja sprängas men min fråga är.
Jag har en klass som tar tre parametrar, (enum, int, int)
Detta är en polymorf klass vilket gör att ett antal virtuella funktioner hänger med.
En sådan funktion är att returna en bestämmd enum, men detta blir konflikt efter som jag har flera olika enums(sry vet er bättre namn) tex kan jag skicka in ( blabla, int ,int) från en cpp fil och (orka, int , int) från en annan.
Efter som då klassen tvingar mig att returna enum så blir de enum värden jag skickar in alltid samma.

Går det på nått sätt att lösa detta ?
Sry för att jag inte har koden då den befinner sig på dator på annan ort.

Visa signatur

dator: Intel Core i5 3570K | Noctua NH-D14 | MSI Z77A-GD65 ATX | Corsair 16GB 1600MHz VENGEANCE LP | XFX Core Edition 850W 80+ Bronze | Corsair Carbide 500R | Sapphire Radeon HD 7970 GHz 3GB | Samsung SSD 840 Series 250GB | 2st. 2TB Seagate Barracuda 7200rpm SATA 6Gbit/s | DVD±RW Samsung 24X DL
Kringutrustning: ASUS MX279H 27" | Microsoft sidewinder x4 | Func MS-3 v2

Permalänk
Hedersmedlem

Någon sorts exempel skulle kanske hjälpa.
Gör det något att värdena är samma om du vet vilken klass det handlar om?

Permalänk
Skrivet av Elgot:

Någon sorts exempel skulle kanske hjälpa.
Gör det något att värdena är samma om du vet vilken klass det handlar om?

Eftersom jag inte har koden blir exempel svårt, mycket kod som måste skrivas ut för att visa.

I top header filen står typ

enum ENUM {NO, YES}
.
.
Virtual ENUM getENUM();

Sedan står det i klassen som jag tar emot parametrar.

Class:: Classname( enum GetENUM, & int, & int) :
.
.
.
Class::ENUM Class ::getENUM{
Return YES;
}

Sist i en cpp fil som skickar in parametrar.
.
.
Push_back(New Class(YES, & int, & int));
.
.

Efter som virtual kräver return så oavsett vad jag skickar in kommer det ändras

Vet att detta inte är tillräckligt har som sagt inte koden o hoppas någon förstår trots usel förklaring.

Skickades från m.sweclockers.com

Visa signatur

dator: Intel Core i5 3570K | Noctua NH-D14 | MSI Z77A-GD65 ATX | Corsair 16GB 1600MHz VENGEANCE LP | XFX Core Edition 850W 80+ Bronze | Corsair Carbide 500R | Sapphire Radeon HD 7970 GHz 3GB | Samsung SSD 840 Series 250GB | 2st. 2TB Seagate Barracuda 7200rpm SATA 6Gbit/s | DVD±RW Samsung 24X DL
Kringutrustning: ASUS MX279H 27" | Microsoft sidewinder x4 | Func MS-3 v2

Permalänk
Hedersmedlem

Vilka klasser har du (och hur förhåller de sig till varandra)? Och exakt vilket problem är det som uppstår?

Kanske har du såhär?

enum ENUM {NO, YES}; class A { public: virtual ENUM getENUM() = 0; }; class B : public A { public: ENUM getENUM() { return YES; } }; class C : public A { public: ENUM getENUM() { return NO; } };

Permalänk

Just för problemet är det 2 klasser som använder sig av en 3e klass och skickar in objekt av den klassen i en vector.
De två klasserna har funktioner som skickar in olika beteenden och enum i den klass som används av båda.
Beteendena lyckas jag skicka in och de objekt som skapas har olika saker som de skall göra.
Enum går att skicka in men efter som den gemensammt använda klassen är samma typ av polymorf klass som de andra två har den en ENUM getENUM() funktion som kräver return värde.
Enum värdet används för att jämföra dessa skapade objekt, och genom att funktionen kräver retur värde så får alla skapade objekt samma värde.
Jag behöver få funktionen att använda det enum värde jag skickar in istället för att returna samma värde.

Skickades från m.sweclockers.com

Visa signatur

dator: Intel Core i5 3570K | Noctua NH-D14 | MSI Z77A-GD65 ATX | Corsair 16GB 1600MHz VENGEANCE LP | XFX Core Edition 850W 80+ Bronze | Corsair Carbide 500R | Sapphire Radeon HD 7970 GHz 3GB | Samsung SSD 840 Series 250GB | 2st. 2TB Seagate Barracuda 7200rpm SATA 6Gbit/s | DVD±RW Samsung 24X DL
Kringutrustning: ASUS MX279H 27" | Microsoft sidewinder x4 | Func MS-3 v2

Permalänk

Klass 1
Push_back(klass3(enum YES, &int6, &int7)
Klass 2
Push_back(klass3(enum NO, &int9, &int4)
Klass 3
Tar emot parametrarna.
Men sedan pga virtual
.
Klass3::ENUM Klass3::getENUM{
Return YES;
}
Detta gör att oavsett enum parameter så får alla klass objekt enum YES

Skickades från m.sweclockers.com

Visa signatur

dator: Intel Core i5 3570K | Noctua NH-D14 | MSI Z77A-GD65 ATX | Corsair 16GB 1600MHz VENGEANCE LP | XFX Core Edition 850W 80+ Bronze | Corsair Carbide 500R | Sapphire Radeon HD 7970 GHz 3GB | Samsung SSD 840 Series 250GB | 2st. 2TB Seagate Barracuda 7200rpm SATA 6Gbit/s | DVD±RW Samsung 24X DL
Kringutrustning: ASUS MX279H 27" | Microsoft sidewinder x4 | Func MS-3 v2

Permalänk
Hedersmedlem

Hur ser klasshierarkin ut (är Klass3 basklassen)? Har du verkligen nytta av de virtuella funktionerna (vill du inte snarare göra push_back(klass1(...)) och liknande)?
Annars kanske man kan låta Klass3::getENUM() göra något vettigare än att returnera något hårdkodat?

Permalänk
Skrivet av Elgot:

Hur ser klasshierarkin ut (är Klass3 basklassen)? Har du verkligen nytta av de virtuella funktionerna (vill du inte snarare göra push_back(klass1(...)) och liknande)?
Annars kanske man kan låta Klass3::getENUM() göra något vettigare än att returnera något hårdkodat?

Klass 3 är en subklass på samma nivå som 1 och 2.
Svar ja, använder virtuella funktioner.
Klass 3 getENUM skall retunera samma ENUM som jag skickar in som parameter. Vilket den inte gör och det som är problemet,

Så länge inte getENUM ändrar enum parametern så får den gärna göra vad *** den vill.

Skickades från m.sweclockers.com

Visa signatur

dator: Intel Core i5 3570K | Noctua NH-D14 | MSI Z77A-GD65 ATX | Corsair 16GB 1600MHz VENGEANCE LP | XFX Core Edition 850W 80+ Bronze | Corsair Carbide 500R | Sapphire Radeon HD 7970 GHz 3GB | Samsung SSD 840 Series 250GB | 2st. 2TB Seagate Barracuda 7200rpm SATA 6Gbit/s | DVD±RW Samsung 24X DL
Kringutrustning: ASUS MX279H 27" | Microsoft sidewinder x4 | Func MS-3 v2

Permalänk
Hedersmedlem
Skrivet av vallentiin:

Klass 3 är en subklass på samma nivå som 1 och 2.
Svar ja, använder virtuella funktioner.

Varför används inte de andra klasserna? Lite av tanken med virtuella funktioner är väl att hantera objekt av basklasstyp och låta dem själva lista ut vilka funktioner som skall användas?

Skrivet av vallentiin:

Klass 3 getENUM skall retunera samma ENUM som jag skickar in som parameter. Vilket den inte gör och det som är problemet,

Så länge inte getENUM ändrar enum parametern så får den gärna göra vad *** den vill.

Så, kan man inte bara spara värdet i en variabel som senare kan returneras?

Permalänk
Skrivet av Elgot:

Varför används inte de andra klasserna? Lite av tanken med virtuella funktioner är väl att hantera objekt av basklasstyp och låta dem själva lista ut vilka funktioner som skall användas?

Så, kan man inte bara spara värdet i en variabel som senare kan returneras?

De andra används, men det är ett för stort program för att förklara alls funktioner så försöker hålla mig till problemet då inget i de andra klasserna påverkar problemet.

Nope, det funkar ej.

Skickades från m.sweclockers.com

Visa signatur

dator: Intel Core i5 3570K | Noctua NH-D14 | MSI Z77A-GD65 ATX | Corsair 16GB 1600MHz VENGEANCE LP | XFX Core Edition 850W 80+ Bronze | Corsair Carbide 500R | Sapphire Radeon HD 7970 GHz 3GB | Samsung SSD 840 Series 250GB | 2st. 2TB Seagate Barracuda 7200rpm SATA 6Gbit/s | DVD±RW Samsung 24X DL
Kringutrustning: ASUS MX279H 27" | Microsoft sidewinder x4 | Func MS-3 v2

Permalänk
Hedersmedlem
Skrivet av vallentiin:

Nope, det funkar ej.

Varför inte? Om du bara använder Klass3-objekt har väl inte arv, virtuella funktioner och liknande så stor betydelse; problemet är väl snarare att inparametrarna inte används?

Permalänk
Skrivet av Elgot:

Varför inte? Om du bara använder Klass3-objekt har väl inte arv, virtuella funktioner och liknande så stor betydelse; problemet är väl snarare att inparametrarna inte används?

Parametrarna ser ut (ENUM,int,int)
Intarna används, enum tas in men skrivs över av getENUM funktion i klass 3 som är virtual.

Skickades från m.sweclockers.com

Visa signatur

dator: Intel Core i5 3570K | Noctua NH-D14 | MSI Z77A-GD65 ATX | Corsair 16GB 1600MHz VENGEANCE LP | XFX Core Edition 850W 80+ Bronze | Corsair Carbide 500R | Sapphire Radeon HD 7970 GHz 3GB | Samsung SSD 840 Series 250GB | 2st. 2TB Seagate Barracuda 7200rpm SATA 6Gbit/s | DVD±RW Samsung 24X DL
Kringutrustning: ASUS MX279H 27" | Microsoft sidewinder x4 | Func MS-3 v2

Permalänk
Hedersmedlem
Skrivet av vallentiin:

Parametrarna ser ut (ENUM,int,int)
Intarna används, enum tas in men skrivs över av getENUM funktion i klass 3 som är virtual.

Fast om det bara handlar om objekt av typen Klass3 spelar det väl ingen större roll att den är virtuell? Problemet är väl just att getENUM ser ut såhär:

Klass3::ENUM Klass3::getENUM{ Return YES; }

Inget "skrivs väl över" (det är ju ett Klass3-objekt man har, så det är väl dess funktion man bör använda), men man verkar ju inte heller göra något med informationen som gavs till konstruktorn. Om man vill utnyttja virtuella funktioner bör man ha ett objekt av basklasstyp som "egentligen" är av någon underklasstyp.

Edit:
Om du vill att till exempel Klass2::getENUM() skall anropas behöver du ett Klass2-objekt någonstans. Har du det?

Permalänk
Skrivet av Elgot:

Fast om det bara handlar om objekt av typen Klass3 spelar det väl ingen större roll att den är virtuell? Problemet är väl just att getENUM ser ut såhär:

Klass3::ENUM Klass3::getENUM{ Return YES; }

Inget "skrivs väl över" (det är ju ett Klass3-objekt man har, så det är väl dess funktion man bör använda), men man verkar ju inte heller göra något med informationen som gavs till konstruktorn. Om man vill utnyttja virtuella funktioner bör man ha ett objekt av basklasstyp som "egentligen" är av någon underklasstyp.

Edit:
Om du vill att till exempel Klass2::getENUM() skall anropas behöver du ett Klass2-objekt någonstans. Har du det?

Angående överskrivning vet jag faktiskt inte exakt vad som sker allt jag vet är att getENUM som står i klass3 är det ENUM Som blir när en klass3 skapas, jag vill ha ett klass3 objekt med de parametrar jag skickar in från de andra klasserna
Ja har ett objekt av klass1 och klass2. De har samma getENUM funktion eftersom virtual...

Skickades från m.sweclockers.com

Visa signatur

dator: Intel Core i5 3570K | Noctua NH-D14 | MSI Z77A-GD65 ATX | Corsair 16GB 1600MHz VENGEANCE LP | XFX Core Edition 850W 80+ Bronze | Corsair Carbide 500R | Sapphire Radeon HD 7970 GHz 3GB | Samsung SSD 840 Series 250GB | 2st. 2TB Seagate Barracuda 7200rpm SATA 6Gbit/s | DVD±RW Samsung 24X DL
Kringutrustning: ASUS MX279H 27" | Microsoft sidewinder x4 | Func MS-3 v2

Permalänk
Hedersmedlem
Skrivet av vallentiin:

Angående överskrivning vet jag faktiskt inte exakt vad som sker allt jag vet är att getENUM som står i klass3 är det ENUM Som blir när en klass3 skapas, jag vill ha ett klass3 objekt med de parametrar jag skickar in från de andra klasserna
Ja har ett objekt av klass1 och klass2. De har samma getENUM funktion eftersom virtual...

Fast när använder du de andra klasserna? Ovan:

Push_back(klass3(enum YES, &int6, &int7) Push_back(klass3(enum NO, &int9, &int4)

ser det ut som att du bara skapar Klass3-objekt, fast med olika inparametrar, och om du bara har sådana objekt kommer inte virtuella funktioner göra något för att hjälpa dig.

Med mina exempelklasser ovan kommer

B* b = new B(); C* c = new C(); A* a1 = b; A* a2 = c;

a1->getENUM() och b->getENUM() respektive a2->getENUM() och c->getENUM() returnera samma sak med hjälp av virtuella funktioner, men det bygger på att B och C båda är underklasser till A (som deklarerar funktionen som virtuell).
I ditt fall verkar man snarare ha

B* b =new B()

men vilja att C::getENUM() skall köras när man gör b->getENUM(). Eller tolkar jag dig fel?

Permalänk
Skrivet av Elgot:

Fast när använder du de andra klasserna? Ovan:

Push_back(klass3(enum YES, &int6, &int7) Push_back(klass3(enum NO, &int9, &int4)

ser det ut som att du bara skapar Klass3-objekt, fast med olika inparametrar, och om du bara har sådana objekt kommer inte virtuella funktioner göra något för att hjälpa dig.

Med mina exempelklasser ovan kommer

B* b = new B(); C* c = new C(); A* a1 = b; A* a2 = c;

a1->getENUM() och b->getENUM() respektive a2->getENUM() och c->getENUM() returnera samma sak med hjälp av virtuella funktioner, men det bygger på att B och C båda är underklasser till A (som deklarerar funktionen som virtuell).
I ditt fall verkar man snarare ha

B* b =new B()

men vilja att C::getENUM() skall köras när man gör b->getENUM(). Eller tolkar jag dig fel?

Då jag är lite av en nybörjare i programmering så är allt lite svårt.
Att B och C är underklasser till A skulle ej funka för övriga programmet.

Jag håller på att göra ett enklare spel nämligen, så:

Jag anroppar Klass 1 och klass 2 från en cpp fil och där igenom push_back:ar jag 2 st objekt med klass 1 och klass 2, dessa två klasser har getENUM(){ return YES; och getENUM(){ return NO; Dessa två klasser har samma nivå i heiarkin, den tredje klassen har också samma nivå men den skapas genom push_back från klass 1 och klass 2. Detta skall skapa ett objekt av klass 3 men med parametrarna och samma ENUM som den klass som skapade den. Alltså när klass2 skapar ett klass3 objekt vill jag att: Klass3:: getENUM() return Klass2::getENUM; Och när klass1 skapar en klass3 objekt vill jag att: Klass3::getENUM() return klass1::getENUM

Visa signatur

dator: Intel Core i5 3570K | Noctua NH-D14 | MSI Z77A-GD65 ATX | Corsair 16GB 1600MHz VENGEANCE LP | XFX Core Edition 850W 80+ Bronze | Corsair Carbide 500R | Sapphire Radeon HD 7970 GHz 3GB | Samsung SSD 840 Series 250GB | 2st. 2TB Seagate Barracuda 7200rpm SATA 6Gbit/s | DVD±RW Samsung 24X DL
Kringutrustning: ASUS MX279H 27" | Microsoft sidewinder x4 | Func MS-3 v2

Permalänk
Hedersmedlem

Och varför var det du inte kunde ha någon variabel i Klass3 som talade om vad som gäller?