标签: operator-overloading

为什么要覆盖operator()?

Boost Signals库中,它们重载了()运算符.

这是C++中的约定吗?对于回调等?

我在同事的代码中看到了这一点(恰好是Boost的忠实粉丝).在那里的所有Boost善良中,这只会让我感到困惑.

有关这种超载原因的任何见解?

c++ boost operator-overloading functor function-call-operator

52
推荐指数
6
解决办法
6万
查看次数

我可以使用operator ==如果我只实现了运算符<?

我已经operator<为某个对象实现了.从逻辑上讲,如果!(a < b)!(b < a)它的意思a == b.

这是自动推断的吗?==如果我只实施,我可以使用<吗?

c++ operator-overloading

51
推荐指数
9
解决办法
8983
查看次数

运算符重载==,!=,等于

我已经经历了一个问题

我明白,有必要实施==,!=Equals().

public class BOX
{
    double height, length, breadth;

    // this is first one '=='
    public static bool operator== (BOX obj1, BOX obj2)
    {
        return (obj1.length == obj2.length 
                    && obj1.breadth == obj2.breadth 
                    && obj1.height == obj2.height);
    }

    // this is second one '!='
    public static bool operator!= (BOX obj1, BOX obj2)
    {
        return !(obj1.length == obj2.length 
                    && obj1.breadth == obj2.breadth 
                    && obj1.height == obj2.height);
    }

    // this is third one 'Equals'
    public …
Run Code Online (Sandbox Code Playgroud)

.net c# compiler-errors operator-overloading

49
推荐指数
4
解决办法
7万
查看次数

为类层次结构重载operator ==的正确方法是什么?

假设我有以下类层次结构:

class A
{
    int foo;
    virtual ~A() = 0;
};

A::~A() {}

class B : public A
{
    int bar;
};

class C : public A
{
    int baz;
};
Run Code Online (Sandbox Code Playgroud)

operator==为这些类重载的正确方法是什么?如果我让它们都是自由函数,那么B和C不能在没有强制转换的情况下利用A的版本.它还会阻止某人进行只有A引用的深度比较.如果我将它们作为虚拟成员函数,那么派生版本可能如下所示:

bool B::operator==(const A& rhs) const
{
    const B* ptr = dynamic_cast<const B*>(&rhs);        
    if (ptr != 0) {
        return (bar == ptr->bar) && (A::operator==(*this, rhs));
    }
    else {
        return false;
    }
}
Run Code Online (Sandbox Code Playgroud)

再次,我仍然需要施放(并且感觉不对).有没有一种首选的方法呢?

更新:

到目前为止只有两个答案,但看起来正确的方式类似于赋值运算符:

  • 使非叶类抽象化
  • 在非叶类中受保护的非虚拟
  • 在叶类中公共非虚拟

任何用户尝试比较两个不同类型的对象都不会编译,因为基本功能受到保护,叶子类可以利用父类的版本来比较那部分数据.

c++ operator-overloading

48
推荐指数
4
解决办法
7万
查看次数

friend声明声明了非模板函数

我有一个基类类似于下面的代码.我试图重载<<以与cout一起使用.但是,g ++说:

base.h:24: warning: friend declaration ‘std::ostream& operator<<(std::ostream&, Base<T>*)’ declares a non-template function
base.h:24: warning: (if this is not what you intended, make sure the function template has already been declared and add <> after the function name here) -Wno-non-template-friend disables this warning
Run Code Online (Sandbox Code Playgroud)

我尝试在类声明/原型中添加<<之后的<>.但是,我明白了does not match any template declaration.我一直试图让操作符定义完全模板化(我想要的),但我只能使用以下代码使用操作符手动实例化.

base.h

template <typename T>
class Base {
  public:
    friend ostream& operator << (ostream &out, Base<T> *e);
};
Run Code Online (Sandbox Code Playgroud)

base.cpp

ostream& operator<< (ostream &out, Base<int> *e) {
    out << e->data;
return …
Run Code Online (Sandbox Code Playgroud)

c++ templates operator-overloading friend specialization

47
推荐指数
4
解决办法
3万
查看次数

什么是比较参考类型的两个实例的"最佳实践"?

我最近遇到过这种情况,到目前为止,我一直在愉快地重写等于运算符(==)和/或Equals方法,以查看两个引用类型是否实际包含相同的数据(即两个看起来相同的不同实例).

我一直在使用它,因为我已经进行了更多的自动化测试(比较参考/预期数据与返回的数据).

在查看MSDN中的一些编码标准指南时,我遇到了一篇建议反对它的文章.现在我理解为什么文章说这个(因为它们不是同一个实例)但它没有回答这个问题:

  1. 比较两种参考类型的最佳方法是什么?
  2. 我们应该实施IComparable吗?(我还看到提到这应该仅为值类型保留).
  3. 有一些我不知道的界面吗?
  4. 我们应该自己动手吗?!

非常感谢^ _ ^

更新

看起来我错误地阅读了一些文档(这是漫长的一天)并且压倒Equals可能是要走的路.

如果要实现引用类型,则应考虑在引用类型上覆盖Equals方法(如果类型看起来像基本类型,如Point,String,BigNumber等).大多数引用类型不应重载等于运算符,即使它们重写等于.但是,如果要实现旨在具有值语义的引用类型(例如复数类型),则应覆盖相等运算符.

.net c# comparison equality operator-overloading

45
推荐指数
3
解决办法
3万
查看次数

为什么某些运算符只能作为成员函数重载,其他作为友元函数,其余的作为两者?

为什么某些运算符只能作为成员函数重载,其他作为非成员"自由"函数,其余的作为两者?

这些背后的理由是什么?

如何记住哪些运营商可以超载(成员,免费或两者)?

c++ class operator-overloading member-functions

45
推荐指数
3
解决办法
9419
查看次数

C++中运算符重载的返回值

我有一个关于C++中运算符重载的返回值的问题.通常,我发现了两种情况,一种是按值返回,一种是按引用返回.那么这个规则是什么呢?特别是在可以连续使用操作员的情况下,例如cout<<x<<y.

例如,当实现+操作"string +(string)"时.你将如何通过ref或val返回返回值.

c++ operator-overloading

45
推荐指数
3
解决办法
5万
查看次数

如何通过"新"运算符阻止类分配?(我想确保我的RAII类总是在堆栈上分配.)

我想确保我的RAII类总是在堆栈上分配.

如何通过"新"运算符阻止类分配?

c++ operator-overloading c++-faq

44
推荐指数
2
解决办法
8425
查看次数

重载运算符==与Equals()

我正在开发一个C#项目,直到现在,我已经使用了不可变对象和工厂来确保Foo始终可以比较类型对象的相等性==.

Foo创建后无法更改对象,并且工厂始终为给定的参数集返回相同的对象.这很好用,在整个代码库中我们假设它==始终用于检查相等性.

现在我需要添加一些引入边缘情况的功能,但这并不总是有效.最简单的方法是operator ==为该类型重载,以便项目中的其他代码都不需要更改.但这让我感觉像代码味道:重载operator ==并且Equals不仅仅是看起来很奇怪,而且我习惯于==检查引用相等性的约定,并Equals检查对象的相等性(或任何术语).

这是一个合理的问题,还是我应该继续超载operator ==

c# equals operator-overloading

44
推荐指数
6
解决办法
3万
查看次数