【问题标题】:Unable to call a object changing method无法调用对象更改方法
【发布时间】: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::setExample 对象。然后我对集合进行迭代并为每个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&lt;Example&gt; example_set;
  • 是的,有道理。在我继续构建我的代码时,我会牢记这一点。谢谢!

标签: c++ object pointers reference


【解决方案1】:

这里只是一些理论背景。您应该记住std::set 是作为二叉树实现的,因此元素在树中的插入位置取决于它的值以及树上已经存在的元素的值,这是在插入每个元素期间定义的.

构建此二叉树后,可以使用 log(n) 性能按排序顺序检索和插入元素,更改树上单个元素的值会打乱顺序。

这就是为什么在这种情况下,您应该删除并重新插入 std::set 上的修改元素,或者使用另一个容器,例如 std::vectorstd::list

【讨论】:

  • 是的!感谢您指出这一点!我完全忘记了集合是不可变的。当我将集合更改为矢量时,我的代码可以完美运行!
猜你喜欢
  • 2017-02-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-31
  • 1970-01-01
  • 1970-01-01
  • 2012-06-24
相关资源
最近更新 更多