(C++) operator^ probléma

Fórumok

Hellosztok!

Van egy Nagyegesz osztályom. Ez adott. Le kell kezelnem a

Nagyegesz operator^(unsigned int,unsigned int);

-t, de ha az osztályon kívül írom ezt vagy osztályon belül friend-del, akkor ezt kapom:

nagyegesz.h:50:39: error: ‘Nagyegesz operator^(unsigned int, unsigned int)’ must have an argument of class or enumerated type

A == ; != és egyéb operátorok működnek tökéletesen, csak ezzel van van. Szerintetek mi lehet a probléma?

Hozzászólások

Te most at akarod definialni a ket unsigned int kozti xort? Raadasul ugy, hogy Nagyegesz legyen az eredmeny?

--
There are free things in life i'll never understand
Spelling and counting

nem lehet ilyet, legalabb az egyik argumentumnak user defined-nak kell lenni

--
NetBSD - Simplicity is prerequisite for reliability

A programkód így néz ki:
...
unsigned alap1=3;
unsigned kitevo1=101;
Nagyegesz nf;
nf=alap1^kitevo1;
...

Van más mód, hogy ezt a kódot működésre bírjam, úgy, hogy ehhez a részhez, amit most írtam nem nyúlok?
Én ezért gondoltam arra, amit fentebb írtam, de más nem jut eszembe.

(csak a Nagyegesz osztályon belül dolgozhatok)
---------------------------
Oszt jónapot!

Van ugye ez a kód. Nem nyúlsz hozzá, de meg kell kapd, tehát abból egy temporary file-t írhatsz, mielőtt megemésztenéd. Tehát tekintsük ezt az előemésztést az emésztés részének. :)

Mondjuk valóban nem látom a pontos feladatot. Érdekességképpen elmesélem, hogy nekem a gputils-ban lévő PIC assemblerrel gyűlt meg a bajom. Egész egyszerűen bizonyos MCU-k egyes utasításait nem ismerte. Erre kitaláltam, hogy a forráskódot megírom szépen, de egy scripttel végigrohanok a file-on, írok egy temporary file-t, amelyben a nem ismert mnemonikokat

DB konstans

formában helyettesítem, majd erre a file-ra eresztettem az assembler-t. Volt, ahova macro hivatkozást kellett írnom, hiszen a konstans függött az operandustól. Sebaj, megírtam a macro-kat, s a temporary file-ba include-oltam a macro-kat tartalmazó file-t.

A módszer bevált, jól használható volt.

tr [:lower:] [:upper:] <<<locsemege
LOCSEMEGE

Randa megoldás, de ha már be tudsz include-olni egy osztályt, akkor melléteszel egy macro-t ami kicseréli az elso unsigned intet Nagyegész osztályra. Nagyegésznek csinálsz egy konstruktort, hogy az konvertálja az alapot. A macro-t meg valahogy ugy kéne megírni, hogy csak az ilyen kifejezéekbe nyúljon bele vagy csak ebbe.
Vagy csak kicseréled függvényhívásra, mint ahogy feljebb mondták.

Ez a beadandó feladatom. Kaptam egy main.cpp -t, ami használ Nagyegesz osztályt, amivel lehet összeadni, kivonni, faktort számolni, stb. Abban van ez a kód részlet, ami hatványt számol. Nekem a Nagyegesz osztályt kell megcsinálnom. Csak az a bibi, a tanár kiadta, hogy a main.cpp -t nem szabad módosítani.
---------------------------
Oszt jónapot!

Lehet, hogy ez csak az én tapasztalatom eddig, de úgy vettem észre, hogy elég sok tanár szeret a hatványozás témakörén (ill a hatványozás operátor hiányán) lovagolni ;)

Igaz, lehet, velem van a probléma, de szerintem egy kezemen meg tudom számolni, hogy hányszor volt szükségem hatványozásra programkódban. (Igen, elismerem, van, ahova kell.)

----------------
Lvl86 Troll

Igen, van rá mód, hogy működésre bírd, de nem úgy fog működni, ahogy szeretnéd, hogy működjön, ugyanis két int között nem tudod felüldefiniálni a ^ operátort, mert az alapból definiálva van int visszatérési értékkel. Szóval mivel bármit csinálsz, nem tudsz változtatni azon, hogy mit fog meghívni, ezért biztos, hogy int visszatérési érték lesz, úgyhogy annyit tudsz csinálni, hogy írsz a Nagyegész osztálynak egy kostruktort, ami egy int-et vár. Így már le fog fordulni, de ettől még a hatványozás nem fog tudni int-nél nagyobb számot visszaadni.

egy nem programozó kérdése:
gondolom a Nagyegeszben vannak ilyesmik:
Nagyegesz( const uint kicsi );
Nagyegesz& operator=( const uint kicsi );
ha igen akkor a
Nagyegesz nagy ; ... ; nagy = ( x ^ y )
Nagyegesz nagy( x ^ y )
Nagyegesz nagy = ( x ^ y )
helyzetek kezelve vannak. Milyen helyzeteket akarsz ezeken kívül kezelni?
ncs

szerk: közben látom leírtad a helyzetet... :)

Neked sztem a Nagyegesz operator^(unsigned int& other) -ra van szukseged.

Köszönöm a segítségeteket!

Úgyhogy szerintem kimondható, hogy ez így ebben a formában megoldhatatlan.
---------------------------
Oszt jónapot!

+1, valóban megoldhatatlan, tehát nem létezik olyan nagyegesz.h, ami a fenti (unsigned alap1; unsigned kitevo1) kód eredményén változtat. Mindig a beépített ^ fog meghívódni a két unsignedre.

Ha viszont az egyik unsigned-et Nagyegeszre lehet cserélni a main.cpp-ben, akkor a feladat megoldhato. Például így:

class Nagyegesz {
 public:
  Nagyegesz(unsigned a) {}
 private:
  Nagyegesz();
};
  
Nagyegesz operator^(const Nagyegesz& a, const Nagyegesz& b) {
  return a;
}
 
int main() {
  Nagyegesz a = 5;
  unsigned b = 6; 
  a ^ b;
  b ^ a;
  return 0;
}

Hülye kérdés:
A ^ biztos hatványozást akar jelenteni? (Így szól a feladat?) Mert ha nem, akkor hagyd ki az egész operator^-t, működni fog.

--
Debian - The "What?!" starts not!
http://nyizsa.uni.cc

Háhá... Most esett le.

"Az alábbi main() függvényt NE módosítsák. Kivéve, ha esetleg valami elírást lenne benne. "

Nem csodálkoznék, ha direkt lenne elírva és ki az akinek leesik. :)

Szóval a jelenlegi programkód így néz ki:

...
unsigned alap1=3;
unsigned kitevo1=101;
Nagyegesz nf;
nf=alap1^kitevo1;
...

És ebből csinálom ezt:

...
Nagyegesz alap1=3;
Nagyegesz kitevo1=101;
Nagyegesz nf;
nf=alap1^kitevo1;
...

És a problémát megoldottam. (Szerintem)
---------------------------
Oszt jónapot!

:) csak megoldódott, IQ feladat volt inkább mint c++.
"It should be noted that these operators have a lower precedence than the arithmetic operators, so if ^ were to be overloaded for exponentiation, x ^ y + z may not work as intended."
http://en.wikibooks.org/wiki/C++_Programming/Operators/Operator_Overloa…