我想要实现一个通用的运算符,如下所示: class Foo { public static T operator +<T>(T a, T b) { // Do something with a and b that makes sense for operator + here } } 真的,我想要做的是优雅地处理inheritance。 用Foo中的标准操作符+,T代替“Foo”,如果有人是从Foo派生的(比如BarinheritanceFoo),那么Bar + Bar操作仍然会返回Foo。 我希望用一个通用的operator +来解决这个问题,但是我刚刚得到了一个语法错误(在<)使我相信这样的代码是不合法的。 有没有办法做一个通用的运营商?
赋值运算符可以使用成员函数进行重载,但不能使用非成员函数: class Test { int a; public: Test(int x) :a(x) {} friend Test& operator=(Test &obj1, Test &obj2); }; Test& operator=(Test &obj1, Test &obj2)//Not implemented fully. just for test. { return obj1; } 它导致这个错误: 错误C2801:'operator ='必须是非静态成员 为什么不能使用friend函数来重载赋值操作符? 编译器允许使用friend来重载其他运算符,例如+=和-= 。 支持operator=的固有问题/限制是什么?
我知道=运算符不能被重载,但是一定有办法做到我想在这里: 我只是创build类来表示量化单位,因为我正在做一些物理学。 显然,我不能只从一个原始的inheritance,但我希望我的类与原语完全一样 – 我只是希望它们以不同的方式input。 所以我可以去, Velocity ms = 0; ms = 17.4; ms += 9.8; 等等 我不知道如何做到这一点。 我想我只是写这样的一些类: class Power { private Double Value { get; set; } //operator overloads for +, -, /, *, =, etc } 但显然我不能重载赋值运算符。 有什么办法可以得到这种行为?
我正在尝试使用扩展方法将操作符重载添加到C# StringBuilder类。 具体来说,给定的StringBuilder sb ,我想sb += "text"等于sb.Append("text") 。 以下是为StringBuilder创build扩展方法的语法: public static class sbExtensions { public static StringBuilder blah(this StringBuilder sb) { return sb; } } 它成功地将这个扩展方法添加到了StringBuilder 。 不幸的是,运算符重载似乎不起作用: public static class sbExtensions { public static StringBuilder operator +(this StringBuilder sb, string s) { return sb.Append(s); } } 在其他问题中,关键字在这种情况下是不允许的。 是否可以通过扩展方法添加运算符重载? 如果是这样,那么有什么正确的方法呢?
能够超载的将是非常有用的。 运算符在C ++中,并返回一个对象的引用。 你可以重载operator->和operator*而不是operator. 有这个技术原因吗?
C ++中的赋值运算符可以是虚拟的。 为什么需要? 我们能否让其他运营商也变得虚拟?
给定一个通用的类定义 public class ConstrainedNumber<T> : IEquatable<ConstrainedNumber<T>>, IEquatable<T>, IComparable<ConstrainedNumber<T>>, IComparable<T>, IComparable where T:struct, IComparable, IComparable<T>, IEquatable<T> 我怎样才能为它定义算术运算符? 以下不编译,因为“+”运算符不能应用于types“T”和“T”: public static T operator +( ConstrainedNumber<T> x, ConstrainedNumber<T> y) { return x._value + y._value; } genericstypes'T'受到'where'关键字的约束,正如你所看到的,但是我需要一个具有算术运算符(IAalgorithm)的数字types的约束。 'T'将是一个原始数字types,如int,float等。这种types是否存在“where”约束?
在C ++中,从复制赋值运算符返回引用的概念对我来说是不清楚的。 为什么复制赋值操作符不能返回新对象的副本? 另外,如果我有A类,并且有以下内容: A a1(param); A a2 = a1; A a3; a3 = a2; //<— this is the problematic line 运营商=定义如下: AA::operator =(const A& a) { if (this == &a) { return *this; } param = a.param; return *this; }
如果我想要一个只接受重载操作符的types的generics方法,例如减法操作符,我该怎么办? 我尝试使用接口作为约束,但接口不能有运算符重载。 达到这个目标的最好方法是什么?
这基本上是一个问题,是否有一个“正确”的方式来实现operator<< ? 读这个我可以看到像这样的东西: friend bool operator<<(obj const& lhs, obj const& rhs); 是喜欢类似的东西 ostream& operator<<(obj const& rhs); 但我不明白为什么要用这个或那个。 我个人的情况是: friend ostream & operator<<(ostream &os, const Paragraph& p) { return os << p.to_str(); } 但我可以这样做: ostream & operator<<(ostream &os) { return os << paragraph; } 我应该以什么理由为基础? 注意 : Paragraph::to_str = (return paragraph) 段落是一个string。