我意识到这是一个基本的问题,但我已经在网上搜索过,去了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) 默认情况下,operator ==通过确定两个引用是否指示相同的对象来测试引用相等性,因此引用类型不需要实现operator ==以获得此功能.当一个类型是不可变的,意味着实例中包含的数据不能被改变时,重载operator ==来比较值的相等而不是引用相等可能是有用的,因为作为不可变对象,只要它们具有它们,它们就可以被认为是相同的相同的价值.不建议在非不可变类型中覆盖operator ==.
任何人都可以解释大胆背后的推理吗?
编辑 - 此外,该指南是否==
仅与运营商相关,还是也适用于该Equals
方法?
我有以下代码:
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, …
我发现在这么喜欢仿函数的一些很好的例子这一个,所有的说服力的例子似乎在定义类的使用状态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) 我知道之前有一个几乎类似的问题,但是我无法对此发表评论,因为我是新来的.这就是我发布分离问题的原因.此外,我的问题是对上一个问题的扩展,旨在提供更一般的解决方案.这是前一个问题的链接:如何测试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部分按预期工作,但不是其余的...所以案例列表有点长,我如何测试与它们没有相关值的案例是否相等?
我正在试验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) 我遇到了一个与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.1842554877021
and 运行时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
我想这样做:
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) 我有一个类模板,其构造函数采用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) 我试图了解重载 - >运算符是如何工作的.我有以下课程
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 …