标签: operator-overloading

什么是C++中的重载运算符?

我意识到这是一个基本的问题,但我已经在网上搜索过,去了cplusplus.com,通读了我的书,我似乎无法掌握重载运算符的概念.cplusplus.com的一个具体示例是:

// vectors: overloading operators example
#include <iostream>
using namespace std;

class CVector {
  public:
    int x,y;
    CVector () {};
    CVector (int,int);
    CVector operator + (CVector);
};

CVector::CVector (int a, int b) {
  x = a;
  y = b;
}

CVector CVector::operator+ (CVector param) {
  CVector temp;
  temp.x = x + param.x;
  temp.y = y + param.y;
  return (temp);
}

int main () {
  CVector a (3,1);
  CVector b (1,2);
  CVector c;
  c = a + b;
  cout << c.x …
Run Code Online (Sandbox Code Playgroud)

c++ operator-overloading

6
推荐指数
1
解决办法
2504
查看次数

覆盖非不可变类型中的==运算符

用于重载equals()和操作指引MSDN ==状态:

默认情况下,operator ==通过确定两个引用是否指示相同的对象来测试引用相等性,因此引用类型不需要实现operator ==以获得此功能.当一个类型是不可变的,意味着实例中包含的数据不能被改变时,重载operator ==来比较值的相等而不是引用相等可能是有用的,因为作为不可变对象,只要它们具有它们,它们就可以被认为是相同的相同的价值.不建议在非不可变类型中覆盖operator ==.

任何人都可以解释大胆背后的推理吗?

编辑 - 此外,该指南是否==仅与运营商相关,还是也适用于该Equals方法?

.net c# equality operator-overloading immutability

6
推荐指数
1
解决办法
1506
查看次数

重载运算符<< on ofstream concatenation problems

我有以下代码:

struct simple
{
    simple (int a1, int a2) : member1(a1), member2(a2) {}
    int member1;
    int member2;
};

std::ofstream &operator << (std::ofstream &f, const simple &obj)
{
    f<<obj.member1<<", "<<obj.member2;
    return f;
} 
int main(int argc, const char *argv[])
{
    std::ofstream f("streamout.txt");

    simple s(7,5);
    f << s;               //#1 This works
    f << "label: " << s;  //#2 This fails

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我试图理解为什么#1工作,而在尝试使用重载运算符连接时出现问题,因为#2失败并出现以下错误(MacOSX上的gcc 4.5.3):

错误:无法将'std :: basic_ostream'左值绑定到'std :: basic_ostream &&'/ GCC-FACTORY/4.5/INSTALL/lib/gcc/x86_64-apple-darwin10.5.0/4.5.3/../../. ./../include/c++/4.5.3/ostream:579:5:错误:初始化'std :: basic_ostream <_CharT,_Traits>&std :: operator <<的参数1(std :: basic_ostream <_CharT, …

c++ operator-overloading concatenation ofstream

6
推荐指数
1
解决办法
7982
查看次数

什么时候无状态类函子代替交流风格功能?

我发现在这么喜欢仿函数的一些很好的例子一个,所有的说服力的例子似乎在定义类的使用状态operator().

我在一本书中找到了一个例子来定义没有状态的函数调用操作符,我不禁觉得这是一个尴尬的用法,而且一个普通的样式函数指针,会比operator()在各方面使用更好 - 更少的代码,更少的变量(你必须实例化比较器),它可能由于实例化而更有效,并且没有意义或封装的损失(因为它只是一个函数).

我知道std::sort让你在operator()类和函数之间进行选择,但由于上述逻辑,我总是只使用这些函数.

为什么选择课程的原因是什么?

这是一个例子(释义):

class Point2D {
   //.. accessors, constructors
   int x,y;
};
class HorizComp {
public:
   bool operator()(const Point2D& p, const Point2D& q) const
   { return p.getX() < q.getX(); }
};

class VertComp {
public:
   bool operator()(const Point2D& p, const Point2D& q) const
   { return p.getY() < q.getY(); }
};

template <typename E, typename C>
void printSmaller(const E& p, const E& q, const C& isLess) { …
Run Code Online (Sandbox Code Playgroud)

c++ operator-overloading functor

6
推荐指数
2
解决办法
1106
查看次数

具有相关值的swift枚举中的等于运算符重载

我知道之前有一个几乎类似的问题,但是我无法对此发表评论,因为我是新来的.这就是我发布分离问题的原因.此外,我的问题是对上一个问题的扩展,旨在提供更一般的解决方案.这是前一个问题的链接:如何测试Swift枚举与相关值的相等性

我想在枚举中测试相关值的相等性:

enum MyEnum {
    case None
    case Error
    case Function(Int) // it is a custom type but for briefness an Int here
    case ...
}
Run Code Online (Sandbox Code Playgroud)

我试着设置一个重载函数,如下所示

func ==(a: MyEnum, b: MyEnum) -> Bool {
    switch (a,b) {
    case (.Function(let aa), .Function(let bb)):
        if (aa==bb) {
            return true
        } else {
            return false
        }
    default:
        if (a == b) {
            return true
        } else {
            return false
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

这不会产生编译时错误,但在运行过程中会因bad_exec而失败.很可能是因为在默认情况下测试a == b,再次调用函数本身..Function部分按预期工作,但不是其余的...所以案例列表有点长,我如何测试与它们没有相关值的案例是否相等?

enums equality operator-overloading swift

6
推荐指数
1
解决办法
1198
查看次数

R中的S4级的一元加

我正在试验R中的S4类,我试图+为我的对象定义一个plus()运算符,即重载加号运算符.我设法重载二进制文件+,但我无法弄清楚如何重载一元加号.这是我想要实现的最小工作(一元运算符不工作)示例:

setClass("HWtest",
         representation(expr  = "character"),
         prototype = list(expr  = NA_character_)
)

H <- new("HWtest", expr="Hello")
W <- new("HWtest", expr="World")

setMethod("+", signature(e1="HWtest", e2="HWtest"),
          function(e1,e2){
            new("HWtest", 
                expr = paste(e1@expr," + ",e2@expr))
          }
)
Run Code Online (Sandbox Code Playgroud)

现在我可以使用+运算符并且它可以顺利运行:

H+W
An object of class "HWtest"
Slot "expr":
[1] "Hello  +  World"
Run Code Online (Sandbox Code Playgroud)

现在,一元加号当然不起作用,所以必须超载

+H
Error in +H : invalid argument to unary operator
Run Code Online (Sandbox Code Playgroud)

所以我尝试以下列方式重载它:

setMethod("+", signature(e="HWtest"),
          function(e){
            new("HWtest", 
                expr = paste("+ ",e@expr))
          }
)
Run Code Online (Sandbox Code Playgroud)

但这会产生错误:

Error in match.call(fun, fcall) : …
Run Code Online (Sandbox Code Playgroud)

r operator-overloading unary-operator s4

6
推荐指数
1
解决办法
283
查看次数

在Objective-C中使用时,有时不会调用在Swift类中声明的运算符重载"<"

我遇到了一个与Swift/Objective-C互操作性相关的奇怪问题.案例是这样的:

我有一个@objc public class GKDistance:NSObject,NSCoding,Comparable用Swift写的.为了比较距离,我添加了一个运算符重载,<如下所示:

public func <(a:GKDistance, b:GKDistance) -> Bool {
    return a.value < b.value
}

public func ==(a:GKDistance, b:GKDistance) -> Bool {
    return a.value == b.value
}
Run Code Online (Sandbox Code Playgroud)

然后将它用于Objective-C方法,如下所示:

if (distance < averageDistance){
    // code
}
Run Code Online (Sandbox Code Playgroud)

调用Objective-C方法时,我可以print()<方法中添加语句和断点,以确认何时使用运算符重载.在一种情况下,它神秘地跳过Swift中定义的运算符重载,并使用两个GKDistance对象之间的常规Objective-C比较器.

当使用distance.value == 2375.1842554877021and 运行时averageDistance.value == 75.671794891357421,distance < averageDistance返回时true,Swift运算符重载永远不会被命中,而Objective-C执行条件内的代码.

如果我将有问题的Objective-C方法转换为Swift,它的行为与预期一致,但我担心在我们的应用程序中各种Objective-C方法中存在其他GKDistance比较,可能无法看到Swift运算符重载.

有没有人遇到与Swift/Objective-C互操作性类似的问题,因为它与运营商重载有关?

operator-overloading objective-c language-interoperability swift

6
推荐指数
1
解决办法
335
查看次数

是否可以使用__rmod__覆盖str的%行为?

我想这样做:

x %doSomething% y
Run Code Online (Sandbox Code Playgroud)

对于任何x和任何y都很容易做到(见下面的代码),除非x是str.

是否有任何方法(例如,添加特殊方法或引发特定错误)导致旧样式字符串格式化失败(类似于1%doSomthing如何通过TypeError失败)并恢复为doSomething对象中定义的__rmod__方法?

class BinaryMessage(object):
  def __init__(self, fn):
    self._fn = fn
  def __rmod__(self, LHS):
    return BinaryMessagePartial(self._fn, LHS)

class BinaryMessagePartial(object):
  def __init__(self, fn, LHS):
    self._fn = fn
    self._LHS = LHS
  def __mod__(self, RHS):
    return self._fn(self._LHS, RHS)

def _doSomething(a , b):
  return a + b

doSomething = BinaryMessage(_doSomething)

result = 5 %doSomething% 6
assert result == 11
Run Code Online (Sandbox Code Playgroud)

python string operator-overloading

6
推荐指数
1
解决办法
136
查看次数

如何为类模板定义非成员运算符重载?

我有一个类模板,其构造函数采用std :: chrono :: duration,因为我希望能够使用chrono_literals来构造它.现在,我正在尝试定义非成员运算符重载,但我无法使用持续时间构造函数:

#include <chrono>
#include <iostream>

using namespace std;

template <int n> struct MyClass {
  MyClass() = default;

  template <typename REP, typename PERIOD>
  constexpr MyClass(const std::chrono::duration<REP, PERIOD> &d) noexcept
      : num(d.count()) {}

  int num = n;
};

template <int n> bool operator==(MyClass<n> lhs, MyClass<n> rhs) {
  return lhs.num == rhs.num;
}

int main(int argc, char *argv[]) {
  using namespace std::literals::chrono_literals;

  MyClass<0> m1(10ns);

  if (m1 == 10ns)
    cout << "Yay!" << endl;
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

gcc拒绝我的重载就是这个错误:

main.cpp:34:12: error: …
Run Code Online (Sandbox Code Playgroud)

c++ templates operator-overloading c++11 c++14

6
推荐指数
2
解决办法
906
查看次数

关于重载 - >运算符的说明

我试图了解重载 - >运算符是如何工作的.我有以下课程

class Message {

public:
    Message(string message) :m_text(message) {}
    void printText() {
        cout << "text is " << m_text << endl;
    }
    string m_text;
};


class MessagePointerWrapper
{
public:

    MessagePointerWrapper(string message)  {
        m_message = std::make_unique<Message>(message);
    }

    Message* operator->() {

        return m_message.get();
    }

    std::unique_ptr<Message> m_message;

};

int main(int argc, char** argv)
{

    MessagePointerWrapper messageWrapper =  MessagePointerWrapper("Hello World");
    messageWrapper.m_message->printText();
    messageWrapper->m_text = "PQR";
    messageWrapper.m_message->printText();
}
Run Code Online (Sandbox Code Playgroud)

MessageWrapper级的->运算符重载以返回Message*.所以在主要方法中,当我调用messageWrapper->它返回的是一个Message*.通常当我有一个指针时,我需要使用->运算符或deference运算符来访问该对象.根据该逻辑,为了访问对象的m_text可用性Message …

c++ operator-overloading

6
推荐指数
2
解决办法
180
查看次数