+ Reply to Thread
Results 1 to 5 of 5
  1. #1
    Senior Member Arkimedes has a spectacular aura about Arkimedes has a spectacular aura about
    Join Date
    Oct 2005
    Posts
    106

    Making C++ operators

    I am thinking about making some operators in C++, but I have no clue how to approach it. Something for "to the power of". Alternatively, I could simply make a void method; but I would prefer an operator.

  2. #2
    Senior Member sec_ware has a reputation beyond repute sec_ware has a reputation beyond repute sec_ware has a reputation beyond repute sec_ware has a reputation beyond repute sec_ware has a reputation beyond repute sec_ware has a reputation beyond repute sec_ware has a reputation beyond repute sec_ware has a reputation beyond repute sec_ware has a reputation beyond repute sec_ware has a reputation beyond repute sec_ware has a reputation beyond repute
    Join Date
    Mar 2004
    Posts
    557
    Hi

    Operator overloading[1] is what you want I think.
    The idea is to redefine an operator in the following
    formal way (here: "to the power of")


    Code:
    double operator^(double a,  double b){
    	return(exp(b*log(a)));
    }

    However, the above example won't work if I recall correctly,
    since operator overloading requires a class/structure for some
    reason. I do not know whether this is true in general, or whether
    it can be bypassed.

    One working, but inconsequent example would be

    Code:
    struct mydouble{
    	double value;
    };
    
    double operator^(mydouble a,  double b){
    	return(exp(b*log(a.value)));
    }

    Cheers

    P.s. Certainly, the above construction for the power of
    is superior to a naive for-loop for two reasons:
    (i) it is more general (double in the exponent is possible),
    thus the square can be taken
    (ii) for an integer "b" larger than 20 or so, it is
    faster. The reason: while the for-loop approach grows linearly
    in "b" the other does not.


    [1] http://msdn.microsoft.com/library/de...tm/overl_9.asp
    If the only tool you have is a hammer, you tend to see every problem as a nail.
    (Abraham Maslow, Psychologist, 1908-70)

  3. #3
    Banned csl is a splendid one to behold csl is a splendid one to behold csl is a splendid one to behold csl is a splendid one to behold csl is a splendid one to behold csl is a splendid one to behold
    Join Date
    Nov 2005
    Posts
    63
    sec_ware has hit the nail on the head, to overload an operator, atleast one argument must be a user defined type as below

    Code:
    #include <iostream>
    #include <cmath> // include for pow()
    using namespace std;
    struct PowerFloat { // define PowerFloat type
           float f;
           float operator^(float b) { // change the meaning of the ^ operator
                 return pow(f,b); // compute the actual pow() and return the value
           } 
    };
    int main() {
           float a = 2.0;
           PowerFloat b; 
           b.f = 5;
           cout << (b^a); // output the value of pow using ^ within () due to operator presedence
           return 0;
    }

  4. #4
    Banned whizkid2300 whizkid2300 whizkid2300 whizkid2300 whizkid2300 whizkid2300 whizkid2300 whizkid2300 whizkid2300 whizkid2300 whizkid2300
    Join Date
    Jun 2003
    Posts
    1,302
    Just to jump in and add my two cents... They are both correct, when overloading an operator you have to do it within a class... If I am not mistaken it only works within that class also.

    I wanna say there are some operators that are forbidden also.

    But, I do what all great men do when they don't know.... Turn to a great women and tell her to get my coffee... (Please women don't take offense in that... it was a joke.)

    I use google....

    http://www.cplusplus.com/doc/tutorial/classes2.html

    should give you a nice little read on it

  5. #5
    Ninja Code Monkey Juridian has a reputation beyond repute Juridian has a reputation beyond repute Juridian has a reputation beyond repute Juridian has a reputation beyond repute Juridian has a reputation beyond repute Juridian has a reputation beyond repute Juridian has a reputation beyond repute Juridian has a reputation beyond repute Juridian has a reputation beyond repute Juridian has a reputation beyond repute Juridian has a reputation beyond repute
    Join Date
    Nov 2001
    Location
    Washington State
    Posts
    1,027
    Erm, you don't necessarily have to overload an operator in a class. You can make non member operators to do things like the insertion and extraction operators to handle your user defined classes.

    As an example:

    std::istream& operator>>(std::istream& is, <user defined class>& v )
    {
    // code input data for your user defined class
    return is;
    }

    This operator can then be used in the standard way to use "cin >> <your class>;" to get data for your class.

    You might also look into using templates to make the non member operator more generic.
    "When I get a little money I buy books; and if any is left I buy food and clothes." - Erasmus
    "There is no programming language, no matter how structured, that will prevent programmers from writing bad programs." - L. Flon
    "Mischief my ass, you are an unethical moron." - chsh
    Blog of X

Bookmarks

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts

 Security News

     Patches

       Security Trends

         How-To

           Buying Guides