无法在C ++中的set中插入类对象?

时间:2016-04-17 19:21:27

标签: c++ set

编译器显示错误说明 23:18:错误:传递' const A'作为'这个'参数' void A :: show()'抛弃限定符[-fpermissive] 想知道我在这个程序中使用const的地方

#include <iostream>
#include <memory>
#include <string>
#include <set>
using namespace std;
class A
{
    int i;
    public:
    A(int pi):i(pi) {}
    void show() { cout<<i<<endl; }
    ~A() { cout<<"Destructor : "<<i<<endl; }
};
int main()
{
   set <A> s;

   s.emplace(A(40));
   s.emplace(A(10));
   s.emplace(A(30));
   s.emplace(A(20));
   set <A>::iterator it;
   for(it = s.begin(); it != s.end() ; it++)      // Line 23
      (*it).show();
   return 0;
}

我得到了上面代码的答案,但为什么在指针的情况下工作正常。 e.g。

#include <iostream>
#include <memory>
#include <string>
#include <set>
using namespace std;
class A
{
    int i;
    public:
    A(int pi):i(pi) {}
    void show() { cout<<i<<endl; }
    ~A() { cout<<"Destructor : "<<i<<endl; }
};
int main()
{
   set <A *> s;
   s.emplace(new A(40));
   s.emplace(new A(10));
   s.emplace(new A(30));
   s.emplace(new A(20));
   set <A *>::iterator it;
   for(it = s.begin(); it != s.end() ; it++)
      (*it)->show();
   return 0;
}

输出: 40 10 三十 20 我知道在这种情况下我也需要定义自己的删除器。只是想着怎么做?

1 个答案:

答案 0 :(得分:0)

集合包含排序唯一对象集。要对对象进行排序,需要使用比较器,如下所示:

bool operator<(const A& lhs, const A& rhs) {
    return lhs.i < rhs.i; // assuming 'i' is public
}

我在代码中看不到任何比较器,您确定能够将“A”类对象插入到集合中吗?

要修复“第23行” - 错误,只需将方法show()标记为const,因为const中的迭代器:

void show() const { cout << i << endl; }

另一种解决方法是const_cast,但这是不好的做法:

const_cast<A&>(*it).show();

请注意const在这种情况下非常有意义。否则,您可能会更改已排序的对象(例如:更改值i)。这可能会破坏排序顺序。