#include <iostream>
class Vector
{
double coords[3];
public:
double &operator[](int i)
{
int k=i%3;
return coords[k];
}
Vector operator() (double x, double y, double z)
{
coords[0]=x;
coords[1]=y;
coords[2]=z;
return *this;
}
Vector operator () (Vector a, Vector b)
{
for (int i=0;i<3;i++)
coords=a[i+1]*b[i+2]-a[i+2]*b[i+1];
return *this;
}
double operator* (Vector obj)
{
double res=0;
for (int i=0;i<3;i++)
res+=coords*obj;
return res;
}
Vector(double x, double y, double z)
{
coords[0]=x;
coords[1]=y;
coords[2]=z;
}
Vector(double x, double y, double z)
{
float
}
void show()
{
cout<<"("<<coords[0]<<", "<<coords[1]<<","<<coords[2]<<")\n";
}
Vector()
{
for (int i=0;i<3;i++)
coords=0;
}
};
int main()
{
Vector a,b(2,1,3),c;
a(1,-3,4);
a.show();
b.show();
cout<<"a*b="<<a*b<<endl;
c(a,b);
cout<<"[ab]=";
c.show();
return 0;
}
преобразование типов
имеется следующий код, подскажите, как можно самым простым способом сделать преобразование типов? прочитал много разной теории и никак не могу понять на практике как это.:(
где преобразование типов то требуется?
И из какого в какой?
в string, массив, float
еще возник вопрос, как можно перегрузить унарный оператор, что бы он менял направление вектора?
спасибо!
разумеется из пользовательского типа ( и обратно в него)
Перегрузка оператора присваивания что ли требуется?
Цитата: Phodopus
Перегрузка оператора присваивания что ли требуется?
Вероятно, имеется ввиду унарный минус.
Код:
class Vector
{
// ...
// Вычитание векторов
Vector operator - ( cosnt Vector &rhs )
{
return Vector( coords[0]-rhs.coords[0], coords[1]-rhs.coords[1], coords[2]-rhs.coords[2] );
};
// Вектор отрицательного направления
Vector operator - ()
{
return Vector( -coords[0], -coords[1], -coords[2] );
};
// ...
}
{
// ...
// Вычитание векторов
Vector operator - ( cosnt Vector &rhs )
{
return Vector( coords[0]-rhs.coords[0], coords[1]-rhs.coords[1], coords[2]-rhs.coords[2] );
};
// Вектор отрицательного направления
Vector operator - ()
{
return Vector( -coords[0], -coords[1], -coords[2] );
};
// ...
}
Преобразование целевого типа в объект класса Vector достигается путём реализации конструктора с соответствующим параметром. ;)
Преобразование объекта (класса Vector) в целевой тип:
Код:
class Vector
{
// ...
operator double ()
{
// impl
}
operator std::string ()
{
// impl
}
// И т.д.
// ...
}
{
// ...
operator double ()
{
// impl
}
operator std::string ()
{
// impl
}
// И т.д.
// ...
}
Код:
#include <iostream>
#include <windows.h>
#include <string.h>
using namespace std;
const int col=system("color 17");
class Vector
{
double coords[3]; //координаты вектора
public:
//перегрузка оператора квадратных скобок, для индексации обьектов
double &operator[](int i)
{
int k=i%3;
return coords[k];
}
//перегрузка скобок, для присваивания координатам значений
Vector operator() (double x, double y, double z)
{
coords[0]=x;
coords[1]=y;
coords[2]=z;
return *this;
}
//перегрузка скобок, для вычисления вект. произведения
Vector operator () (Vector a, Vector b)
{
for (int i=0;i<3;i++)
coords=a[i+1]*b[i+2]-a[i+2]*b[i+1];
return *this;
}
//перегрузка звездочки, для вычисления скалярного произведения
double operator* (Vector obj)
{
double res=0;
for (int i=0;i<3;i++)
res+=coords*obj;
return res;
}
Vector(double x, double y, double z)
{
coords[0]=x;
coords[1]=y;
coords[2]=z;
}
//в массив
operator double*()
{
return coords;
}
// вычитание векторов
Vector operator - (Vector &rhs)
{
return Vector(coords[0]-rhs.coords[0], coords[1]-rhs.coords[1], coords[2]-rhs.coords[2]);
}
//метод для отображения координат
void show()
{
cout<<"("<<coords[0]<<", "<<coords[1]<<","<<coords[2]<<")\n";
}
Vector()
{
for (int i=0;i<3;i++)
coords=0;
}
/*Vector operator string()
{
stringstream result;
result << '(';
for (int i=0; i < 3; ++i)
{
if (i>0) result << ',';
result << coords;
}
result << ')';
return result.str();
} */
/*Vector operator - ()
{
return Vector( -coords[0], -coords[1], -coords[2] ); //отриц направление
};
Vector operator++ (int)
{
double x;
double y;
double z;
x=+1;
y=+2;
z=+3;
return *this;
}*/
};
int main()
{
Vector a,b,c,m1,m2,st,v;
//вычитание
m1(3,3,3);
m2(1,2,1);
cout<<"m1 = "; m1.show();
cout<<"m2 = "; m2.show();
m1=m1-m2;
cout<<"m1-m2 = "; m1.show();
//в указатель на double, указывающий на начало мсассива
cout<<"mas = ";
for (double *p = st; p != st+3; ++p)
{
cout<<*p<<" ";
st(1,2,3);
}
cout<<endl;
//в строку
v(1,2,3);
//string str = v;
cout<<"vector to string = "<<"(x,y,z)"<<endl;
//----
a(1,-3,4);
b(2,1,3);
cout<<"a = "; a.show();
cout<<"b = "; b.show();
cout<<"a*b="<<a*b<<endl; //скалярное произвед
c(a,b); //векторное произвед
cout<<"[ab]=";
c.show();
return 0;
}
#include <windows.h>
#include <string.h>
using namespace std;
const int col=system("color 17");
class Vector
{
double coords[3]; //координаты вектора
public:
//перегрузка оператора квадратных скобок, для индексации обьектов
double &operator[](int i)
{
int k=i%3;
return coords[k];
}
//перегрузка скобок, для присваивания координатам значений
Vector operator() (double x, double y, double z)
{
coords[0]=x;
coords[1]=y;
coords[2]=z;
return *this;
}
//перегрузка скобок, для вычисления вект. произведения
Vector operator () (Vector a, Vector b)
{
for (int i=0;i<3;i++)
coords=a[i+1]*b[i+2]-a[i+2]*b[i+1];
return *this;
}
//перегрузка звездочки, для вычисления скалярного произведения
double operator* (Vector obj)
{
double res=0;
for (int i=0;i<3;i++)
res+=coords*obj;
return res;
}
Vector(double x, double y, double z)
{
coords[0]=x;
coords[1]=y;
coords[2]=z;
}
//в массив
operator double*()
{
return coords;
}
// вычитание векторов
Vector operator - (Vector &rhs)
{
return Vector(coords[0]-rhs.coords[0], coords[1]-rhs.coords[1], coords[2]-rhs.coords[2]);
}
//метод для отображения координат
void show()
{
cout<<"("<<coords[0]<<", "<<coords[1]<<","<<coords[2]<<")\n";
}
Vector()
{
for (int i=0;i<3;i++)
coords=0;
}
/*Vector operator string()
{
stringstream result;
result << '(';
for (int i=0; i < 3; ++i)
{
if (i>0) result << ',';
result << coords;
}
result << ')';
return result.str();
} */
/*Vector operator - ()
{
return Vector( -coords[0], -coords[1], -coords[2] ); //отриц направление
};
Vector operator++ (int)
{
double x;
double y;
double z;
x=+1;
y=+2;
z=+3;
return *this;
}*/
};
int main()
{
Vector a,b,c,m1,m2,st,v;
//вычитание
m1(3,3,3);
m2(1,2,1);
cout<<"m1 = "; m1.show();
cout<<"m2 = "; m2.show();
m1=m1-m2;
cout<<"m1-m2 = "; m1.show();
//в указатель на double, указывающий на начало мсассива
cout<<"mas = ";
for (double *p = st; p != st+3; ++p)
{
cout<<*p<<" ";
st(1,2,3);
}
cout<<endl;
//в строку
v(1,2,3);
//string str = v;
cout<<"vector to string = "<<"(x,y,z)"<<endl;
//----
a(1,-3,4);
b(2,1,3);
cout<<"a = "; a.show();
cout<<"b = "; b.show();
cout<<"a*b="<<a*b<<endl; //скалярное произвед
c(a,b); //векторное произвед
cout<<"[ab]=";
c.show();
return 0;
}
подскажите пожалуйста, что не так? преобразование в строку не работает(, и как можно сделать аналогичную реализацию только не в string а в *char ?
и как вообще реализуется преобразование обратно? (из чара обратно в мой вектор), так же интересует тот же вопрос по поводу преобразования вектора в массив и(или) флоат и назад в вектор..