Перегрузить оператор функции класса в два раза как установщик и получатель

У меня есть класс, и я хочу перегрузить оператор fuction-call. Но поскольку стандарт C ++ запрещает объявлять два похожих метода, которые отличаются только типом возвращаемого значения, я получаю ошибку компиляции C2556. Я хочу использовать функции как методы получения и установки. Я знаю, что могу добиться этого, создав get и set функция. Итак, вопрос: есть ли способ как-то этого достичь?

class Foo
{
private:
std::vector<int> m_vec;

public:
Foo()
{
m_vec.push_back(1);
m_vec.push_back(2);
m_vec.push_back(3);
}

//Getter
int operator()(int i)
{
return m_vec.at(i);
}

//Setter (C2556)
int& operator()(int i)
{
return m_vec.at(i);
}
};

int main()
{
Foo foo;
foo(1) = 10; //use the setter
int i = foo(1); //use the getter
return 0;
}

1

Решение

Традиционный способ решения этой проблемы заключается в использовании const, такие как:

#include <vector>

class Foo
{
private:
std::vector<int> m_vec;

public:
Foo()
{
m_vec.push_back(1);
m_vec.push_back(2);
m_vec.push_back(3);
}

//Setter
int& operator()(int i)
{
return m_vec.at(i);
}
//getter
int operator()(int i) const
{
return m_vec.at(i);
}
};

int main()
{
Foo foo;
foo(1) = 10; //use the setter
int i = foo(1); //use the getter
const Foo& b = foo;
int j = b(1);
return 0;
}

Теперь компилятор будет использовать «подходящий» метод, когда вы хотите изменить, а не изменить объект. (Вам нужен только оператор const, если вы когда-либо используете Foo в постоянной обстановке)

6

Другие решения

Насколько я понимаю, первая перегрузка не нужна. Достаточно перегрузить

int& operator()(int i)
{
return m_vec.at(i);
}

который затем служит и геттером, и сеттером. Тема также обсуждается Вот.

0

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector