Перегрузка оператора () для собственного класса векторов
У меня есть класс вектор CMyVektor
class CMyVektor
{
private:
int dimension = 0;
std::vector<double> werte;
public:
CMyVektor() {};
CMyVektor(int dimension) : dimension{ dimension }
{
while (dimension-- > 0)
{
werte.push_back(0);
}
};
...
Очень хотелось бы перезагрузить оператор (), для того что бы была возможна запись, где вектору присваивается измерение и координаты
CMyVektor x;
x = (5.0, 7.3);
где x вектор, а то, что в скобках координаты. Количество измерений вектора не должно быть четко задано. То есть написать например два или три аргумента double вместо double [] не подходит. У меня есть такая версия кода, которая не работает.
CMyVektor& CMyVektor::operator()(double a[])
{
int i = 0;
std::cout << "d";
while (a[i]) i++;
this->dimension = i;
while (a[--i])
{
std::cout << a[i];
this->werte[i] = a[i];
}
return *this;
}
Буду очень признателен, если подскажете, что я делаю не так или возможно ли вообще перезагрузить оператор именно так.
Ответы (2 шт):
Есть два разных оператора (...): скобки задающие приоритет операций, и скобки вызова функции. У вас первые, а перегружать можно только вторые.
В качестве альтернативы можно предложить x = {5.0, 7.3};. Чтобы это работало, сделайте своему классу конструктор с параметром std::initializer_list<double>. Пример:
#include <iostream>
#include <initializer_list>
struct A
{
A() {}
A(std::initializer_list<double> list)
{
for (double x : list)
std::cout << x << '\n';
}
};
int main()
{
A a;
a = {1,2,3};
}
Это также позволит конструировать ваш класс списком, вот так: A a = {1,2,3};. Мне кажется, что это хорошо, но если вы хотите разрешить только присваивание а не конструирование, замените конструктор на operator= с тем же параметром.
Первый вариант - std::initializer_list<> который позволяет передавать в параметры множество значений и когда вызываете нужно писать фигурные скобки и там перечислять, что не сделаешь с массивами. В угловых скобках указываем тип. У него есть только три метода - begin(), end(), size()
#include <iostream>
#include <initializer_list>
using namespace std;
class CVektor
{
public:
CVektor(const std::initializer_list<double> list)
{
/*достаем все из инишиализер листа и запихиваем в массив*/
double* m_data = new double[list.size()];
int i = 0;
for (auto& element : list)
{
m_data[i] = element;
++i;
}
/*
работаем с m_data
*/
}
CVektor()
{
}
};
int main()
{
CVektor c;
c={ 2.0,2.0 };
system("pause");
return 0;
}
Но если Вы хотите именно через оператор круглые скобочки то вот -
using arr = double[2];
CVektor& operator()(arr const& loc)
{
// делаем что-то
}
// создание объекта где-то в мейн
CVektor obj;
obj({2.4, 4.0});