【问题标题】:C++: Operator overloading of < for pointers to objectsC++:对象指针的 < 运算符重载
【发布时间】:2020-10-14 04:46:28
【问题描述】:

我想通过地址比较两个对象。我尝试了运算符重载,它似乎不适用于指针,但适用于对象本身。以下是相关代码:

class C {
        public:
                int x;
};
.
.
.
bool operator <( C *ptr_c1, C *ptr_c2 )
{
        return ( (*ptr_c1).x < (*ptr_c2).x );
}

【问题讨论】:

标签: c++ operator-overloading pointers


【解决方案1】:

我尝试过运算符重载,但它似乎不适用于指针,

正确。

但适用于对象本身。

正确。

那么问题是什么?

您想在排序容器中使用指针吗?

与:

#include <iostream>
#include <set>

struct X
{
    int x;
};

C++ 11 及更高版本

int main()
{
    X       x1; x1.x    = 5;
    X       x2; x2.x    = 6;

    auto compare = [](auto const& lhs, auto const& rhs){return lhs->x < rhs->x;};
    std::set<X*, decltype(compare)> plop(compare);

    plop.insert(&x1);
    plop.insert(&x2);
}

在 C++ 03 中

struct XPTest
{
    bool operator()(X* const& lhs,X* const& rhs)
    {
        return lhs->x < rhs->x;
    }
};

int main()
{
    X       x1; x1.x    = 5;
    X       x2; x2.x    = 6;

    std::set<X*,XPTest> plop;

    plop.insert(&x1);
    plop.insert(&x2);
}

【讨论】:

  • 为什么我们必须使用新结构?我们不能使用 struct X 吗?
  • @Ediolot:你可以。但那将是一个坏主意。传递给std::set 的第二个类应该是一个比较类。将测试放在X 中,然后声明std::set&lt;X, X&gt; 似乎不太符合逻辑。
  • 可以通过为X 本身重载operator&lt; 来达到同样的效果吗?
【解决方案2】:
if(*obj1 < *obj2) { /* this should use the overloaded operator. */ }

【讨论】:

  • 我有一个priority_queue中的指针,它又使用'
【解决方案3】:

指针是本机 C++ 类型,您只能为用户定义的类型(即类)重载运算符。

如果这是可能的,它将违反“最少意外”的原则,并导致指针比较根据您的定义是否可见而表现不同。这可能会非常令人困惑。

如果您想在容器或算法中使用替代比较,请注意,在大多数需要偏序的关联容器和算法中,您可以提供默认 std::less 的替换。

【讨论】:

  • 为什么当您使用 std::less 的模板特化时,行为的变化不那么“令人惊讶”?
  • @mastov:将std::less 专门用于原始指针是不合法的。使用另一个函数对象替换 std::less 应该不会那么令人惊讶,因为它需要明确指定。
  • 当然,替换 std::less 的东西 not 不会那么令人惊讶(因为它必须明确使用),我在那里误读了你的答案,我明白你想专业化 std::less。无论如何,我找不到std::less 的专业化参考,因为原始指针是非法的。谁/说的是什么?
猜你喜欢
  • 1970-01-01
  • 2018-10-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-02
相关资源
最近更新 更多