C++ kérdések

Kezdőlap Fórumok Programozás C++ kérdések

10 bejegyzés megtekintése - 61-70 / 120
  • Szerző
    Bejegyzés
  • #2023728
    aty
    Felhasználó

      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
      #include

      using 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 ***

      #2023729
      kl223
      Felhasználó

        Amit csak lehet a függvényeknek, const-ként adj át.

        #2023730
        aty
        Felhasználó

          Ok, 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?

          #2023731
          roante
          Felhasználó

            Nem 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.

            #2023732
            pointux
            Felhasználó

              Termé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…

              #2023733
              pointux
              Felhasználó

                „Amit csak lehet a függvényeknek, const-ként adj át.

                #2023734
                roante
                Felhasználó

                  Nem, 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…

                  #2023735
                  roante
                  Felhasználó

                    Megvan 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#6443469d81f08496

                    Találtam egy gyors referenciát az ott említett könyvre, példákkal illusztrálva:
                    http://www.halpernwightsoftware.com/stdlib-scratch/quickref.html

                    #2023736
                    goraki
                    Felhasználó

                      Elkezdtem í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!

                      #2023737
                      pointux
                      Felhasználó

                        gondolom 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.

                      10 bejegyzés megtekintése - 61-70 / 120
                      • Be kell jelentkezni a hozzászóláshoz.