无法调用对象更改方法
Unable to call a object changing method
我有一个 class 是这样的:
Example.h:
class Example{
private:
int m_x, m_y;
public:
void print_params() const;
void modify_params();
};
Example.cpp:
void Example::print_params() const{
cout << "x: "<< m_x << ", y: " << m_y << endl;
}
void Example::modify_params(){
m_x += 1;
m_y += 1;
}
在我的主文件中,我有 std::set
个 Example
个对象。然后我遍历集合并为每个 Example
对象调用 modify_params()
函数,以便修改每个对象的私有变量。因此,主文件中的代码类似于:
set<Example> example_set;
...
for (auto& example: example_set){
example.modify_params();
}
然而,这并没有编译,我得到以下错误:
'this' argument to member function 'modify_params' has type 'const Example', but function is not marked const.
我在class声明中没有任何地方声明为const
,而且我无法将modify_params()
函数标记为const
,这个函数的用途就是修改私有变量。请记住,我调用 print_params()
方法没有问题,因为它被标记为 const
.
我在这里错过了什么?我怎样才能成功地做我想做的事?
这里只是一些理论背景。你应该记住 std::set
是作为二叉树实现的,所以元素在树中的插入位置取决于它的值和树上已经存在的元素的值,这是在插入期间定义的每个元素。
构建此二叉树的目的是可以按 log(n) 性能的排序顺序检索和插入元素,更改树上单个元素的值会打乱顺序。
这就是为什么在这种情况下,您应该在 std::set
上删除并重新插入修改后的元素,或者使用其他容器,例如 std::vector
或 std::list
。
我有一个 class 是这样的:
Example.h:
class Example{
private:
int m_x, m_y;
public:
void print_params() const;
void modify_params();
};
Example.cpp:
void Example::print_params() const{
cout << "x: "<< m_x << ", y: " << m_y << endl;
}
void Example::modify_params(){
m_x += 1;
m_y += 1;
}
在我的主文件中,我有 std::set
个 Example
个对象。然后我遍历集合并为每个 Example
对象调用 modify_params()
函数,以便修改每个对象的私有变量。因此,主文件中的代码类似于:
set<Example> example_set;
...
for (auto& example: example_set){
example.modify_params();
}
然而,这并没有编译,我得到以下错误:
'this' argument to member function 'modify_params' has type 'const Example', but function is not marked const.
我在class声明中没有任何地方声明为const
,而且我无法将modify_params()
函数标记为const
,这个函数的用途就是修改私有变量。请记住,我调用 print_params()
方法没有问题,因为它被标记为 const
.
我在这里错过了什么?我怎样才能成功地做我想做的事?
这里只是一些理论背景。你应该记住 std::set
是作为二叉树实现的,所以元素在树中的插入位置取决于它的值和树上已经存在的元素的值,这是在插入期间定义的每个元素。
构建此二叉树的目的是可以按 log(n) 性能的排序顺序检索和插入元素,更改树上单个元素的值会打乱顺序。
这就是为什么在这种情况下,您应该在 std::set
上删除并重新插入修改后的元素,或者使用其他容器,例如 std::vector
或 std::list
。