重载运算符<用于指向类对象的指针

时间:2013-06-12 16:21:52

标签: c++ pointers stl operator-overloading

我正在试图弄清楚如何实现一个运算符< Item Pointer类的重载,指向Item类对象。它是存储指向STL集中的项的指针的程序的一部分。有序STL集(按标题按字母顺序排列)需要重载。我知道下面的ItemPtr重载代码是错误的。我以为我可以取消引用指针以获取实际项目,但我不知道如何实现它。我希望我走在正确的轨道上。我感谢任何人都可以分享的任何指针(没有任何双关语)。

bool operator<(const Item& i1, const Item& i2)
{
    const char* str1 = i1.getTitle().c_str();
    const char* str2 = i2.getTitle().c_str();
    return strcmp(str1, str2);
}

bool operator<(const ItemPtr& ip1, const ItemPtr& ip2)
{
    const Item& i1 = *ip1;
    const Item& i2 = *ip2;
    return i1 < i2;
}

感谢。

2 个答案:

答案 0 :(得分:2)

最简单的方法,假设您保证setgetTitle()中没有无效指针const

bool operator<(const ItemPtr& ip1, const ItemPtr& ip2)
{
  return ip1->getTitle() < ip2->getTitle();
}

但我要提醒的是,需要做这种事情会引发我的感觉,即你的设计可能存在问题。特别是,为什么要在Item中存储指针 - set,而不仅仅是Item本身?这真的需要吗?

答案 1 :(得分:0)

您的实施中的错误不是比较ItemPtr,但比较Item s:strcmp()将在str1和{{1}时返回非零值}是不同的,返回非零值意味着str2。如果同时truea < b,则无法获取有序元素。由于b < a比较是作为ItemPtr比较的函数实现的,因此它会遇到同样的问题。

如果您确定Item始终包含有效的ItemPtr引用,则John Dibling提供的解决方案很简单且正确:

Item

如果您还需要比较bool operator<(const ItemPtr& ip1, const ItemPtr& ip2) { return ip1->getTitle() < ip2->getTitle(); }

Item

如果您不能假设bool operator<(const Item& i1, const Item& i2) { return i1.getTitle() < i2.getTitle(); } bool operator<(const ItemPtr& ip1, const ItemPtr& ip2) { return *i1 < *i2; } 存储有效的参考,则必须检查该情况。 (但可能你可以认为)。