重载类函数运算符兼任二传手和吸气手
Overload class function operator twice as setter and getter
我有一个类,我想重载功能调用运算符。但是由于C++标准禁止声明两个仅在返回类型不同的类似方法,因此我得到编译错误 C2556。我想将这些函数用作 getter 和 setter 方法。我知道我可以通过创建一个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
时才需要 const 运算符)
据我了解,第一次重载是不必要的。过载就足够了
int& operator()(int i)
{
return m_vec.at(i);
}
然后同时用作吸气手和二传手。这里也讨论了这个主题。
相关文章:
- 如何通过派生类函数更改基类中的向量
- 库函数需要一个 std::function<void(void)>,如何传入类函数?
- 在类函数中初始化外部作用域变量
- c++ 在非类函数中使用类变量
- SDL_PollEvent() 无法捕获类函数内部SDL_QUIT?
- 从类成员函数到类 C 函数指针的转换
- 如何在模板类函数中分配结构值?
- 有没有办法将重载的类函数绑定到函数对象?
- 启动类函数作为失去引用的线程
- C++调用使用重写函数的父类函数
- 将值传递到另一个类函数在打印时为零
- 计算对类函数的所有调用次数
- 由于签名差异,调用了错误的子类函数
- 使用宏调用类函数
- 虚拟基类函数中派生类的大小
- 模板类/函数中的交叉前向声明
- 在C++中使用非静态类函数的函数
- 无法访问基类函数 C++
- 类函数返回到另一个类函数返回打印不同的值
- 重载类函数运算符兼任二传手和吸气手