【发布时间】:2021-10-04 14:19:34
【问题描述】:
我有一个类似这样的课程:
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();
}
但是,这无法编译,并且我收到以下错误:
成员函数“modify_params”的“this”参数的类型为“const Example”,但函数未标记为 const。
我在类声明中没有将它声明为const,并且我不能将modify_params()函数标记为const,这个函数的目的是修改私有变量。请记住,调用print_params() 方法没有问题,因为它被标记为const。
我在这里缺少什么?我怎样才能成功地做我想做的事?
【问题讨论】:
-
std::set中的对象是常量,不可修改。 -
从集合中移除对象,修改对象,将修改后的对象插入回集合中。
-
...为了效率,如果您使用C++17或更高版本,请使用
std::set::extract,然后修改并移回set。 -
要查看罪魁祸首是
std::set,请将代码更改为使用std::vector<Example> example_set;。 -
是的,有道理。在我继续构建我的代码时,我会牢记这一点。谢谢!
标签: c++ object pointers reference