Witam.
klasa Vec (robiąca za vektor) posiada 2 przeciążenia operatora *:
Vec operator* (double a)const
{
Vec v = (*this);
for (int i = 0; i < v.n; i++)
{
v[i] *= a;
}
return v;
}
double operator* (const Vec& u)const
{
double l = 0;
for(int i = 0; i < (u.n < this->n ? u.n : this->n); i++)
{
l += u[i] * (*this)[i];
}
return l;
}
W momencie, gdy w mainie wywołuję instrukcję:
cout << (wektory[0] * 2)[0]
(gdzie 'wektory' to tablica obiektów klasy Vec), kompilator wyrzuca mi błąd, że nie wie którego operatora użyć (mimo że jest tylko jeden taki, w którym po lewej stoi Vec a po prawej double).
Wiem czemu tak się dzieje: w klasie Vec mam też przeciążenie rzutowania na double:
operator double()const
{
double s = 0;
for (int i = 0; i < this->n; i++)
{
s += (*this).A[i];
}
return sqrt(s);
}
po prostu kompilator ma drugą opcję - niejawne skonwertowanie wektora na double, a następnie pomnożenie doubli. Chcę zachować wszystkie powyższe przeciążenia, i chcę uniknąć tego niejawnego rzutowania. Jak mam to zrobić?
Jeszcze jedno: jak mam sobie to mnożenie przez liczbę:
Vec operator* (double a)const
{
Vec v = (*this);
for (int i = 0; i < v.n; i++)
{
v[i] *= a;
}
return v;
}
to program podczas zmieniania v, zmienia mi też to co stoi w this, a przecież specjalnie zamiast robić v wskaźnikiem na Vec, i ustawiać na to, na co pokazuje this, to wyłuskałem wartości z this, i wstawiam je przez wartość do v...
Dobra, to drugie nieważne, po prostu domyślny konstruktor kopiujący był źle zrobiony. Ponawiam za to pytanie z pierwszego posta.