Re: overloading the [] operator in a vector child class
"y-man" <ygrange@gmail.com> wrote in message
news:1174984615.280828.83980@n59g2000hsh.googlegroups.com...
Hi,
I am creating a child class of the vector, which contains a couple of
functions to make the work with carthesian coordinate vectors easier.
To make things work more easily, I would like to be able to access the
vector through a string which is either x, y or z. So that I can use:
---xyzvec.hh--
#ifndef XYZVEC_HH
#define XYZVEC_HH
#include <vector>
#include <iostream>
xyzvec vec ;
vec["x"] = 3;
double testing = vec["x"].
My class is now:
class xyzvec : public vector<double> {
public:
xyzvec( void ) : vector<double>(3) { }
xyzvec(double x, double y, double z) : vector<double>(3) {
(*this)[0] = x;
(*this)[1] = y;
(*this)[2] = z;
}
double x() { return (*this)[0] ; }
double y() { return (*this)[1] ; }
double z() { return (*this)[2] ; }
double length( void ) {
double n = pow(pow((*this)[0],2) + pow((*this)[1],2) + pow((*this)
[2],2),0.5) ;
return n;
}
double& operator[] (const string&) {
if(string=="x") return &(*this)[0] ;
if(string=="y") return &(*this)[0] ;
if(string=="z") return &(*this)[0] ;
}
private:
} ;
#endif
---
Probably I am doing something horribly wrong with the pointers, but
this yields a big heap of errors.
I can see absolutly no benifit in deriving this class from vector then
either storing a normal array or a vector internal to the class. Even then,
you could just use a simple class. Since this is rather trivial I decided
to write and test one to see how I would do it:
#include <iostream>
#include <string>
#include <cmath>
class xyz
{
public:
xyz(): x_(0), y_(0), z_(0) {}
xyz( double x, double y, double z ): x_(x), y_(y), z_(z) {}
double& operator[] ( const std::string& dim )
{
if ( dim.length() == 1 )
return (*this)[dim[0]];
else
throw "Bad length of dimention requested";
}
double& operator[] ( char dim )
{
if ( dim == 'x' || dim == 'X' )
return x_;
else if ( dim == 'y' || dim == 'Y' )
return y_;
else if ( dim == 'z' || dim == 'Z' )
return z_;
else
throw "Bad dimention requested";
}
double& operator[] ( int dim )
{
if ( dim == 0 )
return x_;
else if ( dim == 1 )
return y_;
else if ( dim == 2 )
return z_;
else
throw "Bad dimention requested";
}
double length( )
{
return std::pow(std::pow(x_,2) + std::pow(y_,2) +
std::pow(z_,2),0.5) ;
}
private:
double x_;
double y_;
double z_;
};
int main()
{
xyz vec1;
vec1["x"] = 3;
double testing = vec1["x"];
std::cout << testing << "\n";
xyz vec2( 5, 10, 15 );
std::cout << vec2[0] << " " << vec2['y'] << " " << vec2["Z"] << " - " <<
vec2.length() << "\n";
std::string wait;
std::getline( std::cin, wait );
}
Now it becomes simple to add functionality. Your length is rather
arbitrary, since it seems to calculate the distnace from 0,0,0 to this
point. It seems more useful to calculate the distance between two points
(if you need the math I can provide it, it's fairly simple though).
What functionality did you wish to provide that vector gives you that this
simple class doesn't give you?