Kezdőlap › Fórumok › Programozás › C++ kérdések
- This topic has 119 hozzászólás, 19 résztvevő, and was last updated 18 years, 9 months telt el by
tovis.
-
SzerzőBejegyzés
-
2006-04-24-13:50 #2023728
A következõ kód MS Visual C++ fordítóval lefordul, és a program normálisan fut, de gccvel beletörik a bicskája bármelyik + operátor felüldefiniálásába. Mit kell másképp csinálni a gcc szabványa szerint?
Code:#include
#include
#includeusing namespace std;
class Pont {
protected:
double x;
double y;
public:
Pont(double,double);
Pont(Pont &k);
// ~Pont();
double Tavolsag();
void Print();
Pont operator+(double&);
Pont operator+(Pont&);
Pont& operator=(Pont&);
friend Pont operator+(double,Pont&);
friend ostream& operator<<(ostream &o,Pont &k) { o << "X: " << k.x << " Y: " << k.y; return o; } }; class Vonal:public Pont { double xv; double yv; public: Vonal(int _x, int _y, int _xv, int _yv) :Pont(_x,_y), xv(_xv), yv(_yv) {} }; //konstruktor Pont::Pont(double _x=0, double _y=0) :x(_x), y(_y) {}; //masolo konstruktor Pont::Pont(Pont &k) { x=k.x; y=k.y; } //ertekadas Pont& Pont::operator=(Pont &k) { x=k.x; y=k.y; return *this; } Pont Pont::operator+(Pont &k) { Pont sum; sum.x=x+k.x; sum.y=y+k.y; return sum; } Pont Pont::operator+(double& d) { Pont sum; sum.x=x+d; sum.y=y+d; return sum; } Pont operator+(double s,Pont& k){ Pont sum; sum.x=k.x+s; sum.y=k.y+s; return sum; } double Pont::Tavolsag() { return sqrt(x*x+y*y); } void Pont::Print() { cout << x << " " << y << endl; } int main() { Pont p1(1.0,2.0); Pont p2; Pont p3; Pont p4; Pont p5; Pont pt[20]; cout << p1.Tavolsag() << endl; p2.Print(); p3=p1+p2; p3.Print(); p4=p1+p3; p4.Print(); p5=10+p1; p5.Print(); cout << p5 << " " << p1 << endl; return 0; }Gcc kimenet:
cd ‘/home/aty/gyak/orokles/debug’ && WANT_AUTOCONF_2_5=”0″ WANT_AUTOMAKE_1_6=”0″ gmake
gmake all-recursive
Making all in src
compiling orokles.cpp (g++)
/home/aty/gyak/orokles/src/orokles.cpp: In function `int main()’:
/home/aty/gyak/orokles/src/orokles.cpp:86: error: no match for ‘operator=’ in ‘p3 = Pont::operator+(Pont&)(((Pont&)(&p2)))’
/home/aty/gyak/orokles/src/orokles.cpp:39: note: candidates are: Pont& Pont::operator=(Pont&)
/home/aty/gyak/orokles/src/orokles.cpp:88: error: no match for ‘operator=’ in ‘p4 = Pont::operator+(Pont&)(((Pont&)(&p3)))’
/home/aty/gyak/orokles/src/orokles.cpp:39: note: candidates are: Pont& Pont::operator=(Pont&)
/home/aty/gyak/orokles/src/orokles.cpp:90: error: no match for ‘operator=’ in ‘p5 = operator+(double, Pont&)(((Pont&)(&p1)))’
/home/aty/gyak/orokles/src/orokles.cpp:39: note: candidates are: Pont& Pont::operator=(Pont&)
gmake[2]: *** [orokles.o] Error 1
gmake[1]: *** [all-recursive] Error 1
gmake: *** [all] Error 2
*** Exited with status: 2 ***2006-04-24-14:35 #2023729Amit csak lehet a függvényeknek, const-ként adj át.
2006-04-24-14:43 #2023730Ok, meglett végül hogy a const kulcsszó hiányzott, kösz.
De ez csak szabvány vagy valami más értelme is van? Gcc nem fordítja le, mert hibalehetõség van abban hogy esetleg a másoló konstruktorban az eredeti objektum sérül?2006-04-27-09:29 #2023731Nem tudja véletlenül közületek vki, hogy hogyan tudok pointert állítani egy globális operátorra? Lehet-e egyáltalán? Nézegettem a neten, de mindenhol csak ködös infókat találtam … Konkrétan egy sima konzolos számológépnél jött elõ a probléma, hogy a „double operator+(double, double)”-ra és társaira szeretnék pointert állítani.
2006-04-29-10:37 #2023732Természetesen úgy, ahogy egy függvényre. Lássuk a példát:
Code:class Class {
public:
void func ( int var ) { std::out << "func var: " << var } void operator= ( int var ) { std::out << "operator= var: " << var } }; void ( Class::*ptr )( int ) = NULL; int main { Class a; ptr = &Class::func; ( a.*ptr ) ( 5 ); ptr = &Class::operator=; ( a.*ptr ) ( 4 ); return 0; }Dinamikus Class esetén . helyett természetesen ->, egyébként a ( *this, *ptr )… is használható a !megfelelõ! helyen. A zárójelek !fontosak! a kiértékelés sorrendje miatt.
Ha erre gondolsz…
2006-04-29-11:34 #2023733„Amit csak lehet a függvényeknek, const-ként adj át.
2006-04-30-13:43 #2023734Nem, nem erre gondoltam, nem memberre szeretnék pointert állítani. Gondolom csak van valahol az unnamed namespace-ben deklarálva valami sima összeadó operátor, és én arra szeretnék pointert állítani… Ideiglenes mo.-nak írtam egy double sum(double a, double b) {return a+b;} fv.-t, erre állítottam pointert, de ez a mo. elég ronda…
2006-05-04-08:45 #2023735Megvan a mo.: a functional-ban vannak ilyen mûveletek, hogy std::plus,a comp.lang.c++ -ról kaptam a választ, a teljes thread:
http://groups.google.co.hu/group/comp.lang.c++/browse_thread/thread/c620c3a6b4b2c14e/6443469d81f08496?hl=hu#6443469d81f08496Találtam egy gyors referenciát az ott említett könyvre, példákkal illusztrálva:
http://www.halpernwightsoftware.com/stdlib-scratch/quickref.html2006-05-08-17:02 #2023736Elkezdtem írogatni egy játékot, script nyelvnek a lua-t választottam, és http://www.gamedev.net/reference/programming/features/lua/page6.asp alapján próbáltam elindulni. Próbáltam class-ba berakni, hogy minden példánynak külön VM-je legyen, és ezt a hibaüzenetet kapom:
Code:proba.cpp: In constructor ‘tobbvm::tobbvm()’:
proba.cpp:40: error: argument of type ‘int (tobbvm::)(lua_State*)’ does not match ‘int (*)(lua_State*)’
proba.cpp:41: error: argument of type ‘int (tobbvm::)(lua_State*)’ does not match ‘int (*)(lua_State*)’Itt az osztály:
Code:class tobbvm{
public:
lua_State* luaVM;
public:
tobbvm();
int lua_p1(lua_State* luaVM);
int lua_p2(lua_State* luaVM);
};
int tobbvm::lua_p1(lua_State* luaVM){
printf(„P1: %sn”, lua_tostring(luaVM, -1));
lua_pushnumber( luaVM, 0 );
return 1;
}
int tobbvm::lua_p2(lua_State* luaVM){ Ugyanaz mint az elõzõ }
tobbvm::tobbvm(){
luaVM = lua_open(0);
if (NULL == luaVM) printf(„Error Initializing luan”);
lua_baselibopen(luaVM);
lua_iolibopen(luaVM);
lua_strlibopen(luaVM);
lua_mathlibopen(luaVM);
lua_register( luaVM, „Proba1”, lua_p1 );
lua_register( luaVM, „Proba2”, lua_p2 );
}Van egy ilyenem is osztályon kívül, ami pedig megy és az osztályost ez alapján csináltam:
Code:int lua_kiir( lua_State* luaVM){
printf(„%s , %sn”, lua_tostring(luaVM, -1), lua_tostring(luaVM, -2) );
lua_pushnumber( luaVM, 0 );
return 1;
}
…
lua_register( luaVM, „Kiir”, lua_kiir );
…Remélem tud valaki segíteni, mert a neten nem találtam hasonlót:(
Elõre is kösz!2006-05-08-17:36 #2023737gondolom ezeknek:
lua_register( luaVM, „Proba1”, lua_p1 );
lua_register( luaVM, „Proba2”, lua_p2 );(*)(lua_State*, [const]char*, int (*)(lua_State*)) a prototípusa, bár sem a sor számát, sem a prototípust – még véletlenül, sem – rajzoltad ide be, úgyhogy így nehéz :))), „de a In constructor ‘tobbvm::tobbvm()’:”-bõl kikövetkeztettem, hogy nem lehet más a 40-41:)
Bár azt nem értem, hogy C++-ban, minek akarsz egy objektumnak paraméterként egy másik objektum tagfüggvényét átadni, amikor pont azért találták ki a C++, hogy ilyet ne kelljen csinálni… ráadásul nem is egyszerû dolog megcsinálni. Még az objektumot is egyszerûbb lenne átadni, de minden bizonnyal azt is fölösleges, mert van jobb alternatíva, teszem azt: öröklõdés. Ráadásul ez C++-ban tetszõleges mélységû lehet. -
SzerzőBejegyzés
- Be kell jelentkezni a hozzászóláshoz.
legutóbbi hsz