У меня есть класс, и я хочу перегрузить оператор 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;
}
Традиционный способ решения этой проблемы заключается в использовании 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
в постоянной обстановке)
Насколько я понимаю, первая перегрузка не нужна. Достаточно перегрузить
int& operator()(int i)
{
return m_vec.at(i);
}
который затем служит и геттером, и сеттером. Тема также обсуждается Вот.