C++ 重载运算符++;前缀/后缀是否相互关联?
我有一个问题以前可能已经被回答了9000多次,但我真的不知道该怎么说,这就是我要尝试的 我在一些C++书籍和教程中看到,当定义自己的类具有一个可迭代的值(可增量的)语义时,可以为它超载<代码>运算符++>代码>(我将这里所说的所有内容都适用于<代码>运算符-<代码>)。这样做的标准方式似乎是:C++ 重载运算符++;前缀/后缀是否相互关联?,c++,operator-overloading,increment,C++,Operator Overloading,Increment,我有一个问题以前可能已经被回答了9000多次,但我真的不知道该怎么说,这就是我要尝试的 我在一些C++书籍和教程中看到,当定义自己的类具有一个可迭代的值(可增量的)语义时,可以为它超载运算符++>代码>(我将这里所说的所有内容都适用于运算符-)。这样做的标准方式似乎是: class MyClass { public: MyClass& operator++ () { increment_somehow(); return *this;
class MyClass {
public:
MyClass& operator++ () {
increment_somehow();
return *this;
}
....
};
其中,increment\u()
well。。。以某种方式增加对象的值
然后,可以用如下方式定义运算符+++
的后缀版本:
MyClass operator++ (MyClass& it, int dummy) {
MyClass copy(it);
++it;
return copy;
}
这一切都很好,也很漂亮(我想我对这个习惯用法的理解是对的),但问题是,对每个定义了operator++
的类执行所有这些操作很快就会变得令人厌倦和冗长,所以我想我可以利用最近在重载运算符时学会的一个技巧。也就是说,利用<代码> <代码>标题和一个内部的叫做“代码> Reloops<代码>的设备,我昨天发现了(我在离开四年后刚刚回到C++):
class-MyClass{
公众:
bool运算符==(constmyclass&that){
以某种方式返回compare\u for\u equality\u(那);
}
布尔运算符<(const MyClass&that){
以某种方式返回比较结果;
}
....
使用名称空间std::rel_ops;//operators>,>=,Boost在实用程序库中提供了此功能。其实现略有不同,但实现的结果相同
我能/应该用这个把戏吗
尽可能地使用它;删除冗余和重复的代码是重构的基本原则,也是一个很好的实践
我是刚刚重新发明了轮子,还是刚刚创建了一个有用的小型库,可以聚合到此类项目中
我想你可以说你已经发明了轮子。不过我不认为这是一件坏事。我发现如果我自己执行了一些东西,我通常会更好地理解它,并且通过这个过程学到很多东西。 < P>你可以使用<代码> <代码>它被直接建进C++语言中,它允许你使用MU。对于同一代码的多个类型,您所需要做的就是确保为每个使用新定义的操作符classtemplate
的类定义了所有方法
有关模板的更多信息,请参阅文档。
如果您有时间,需要经验,请重新设计所有您喜欢的轮子。我自己做了几次,以提高对基本概念的了解。这会有很大帮助。我是原始海报,只是回答说我终于注册到了StackOverflow。因此,我有了一个新的句柄。现在,我要感谢这些答案,特别是动机问题的HeadGeek。另外,为了纠正我自己并遵循tjm的评论,代码使用的确切形式与我发布的不同。使用此方法更正确的方法是通过使用将每个操作符引入类自己的范围>:
namespace scope {
class MyClass {
public:
bool operator== (const MyClass& that) {
return compare_for_equality_somehow(that);
}
bool operator< (const MyClass& that) {
return compare_for_lessality_somehow(that);
}
....
// using namespace std::rel_ops; // that one is incorrect
};
using std::rel_ops::operator=!; // similarly for >, >=, <=
} // end of namespace
命名空间范围{
类MyClass{
公众:
bool运算符==(constmyclass&that){
以某种方式返回compare\u for\u equality\u(那);
}
布尔运算符<(const MyClass&that){
以某种方式返回比较结果;
}
....
//使用名称空间std::rel_ops;//该名称空间不正确
};
使用std::rel_ops::operator=!;//类似地,对于>,>=,谢谢你的回答。我选择了它作为绿色标记。我没有考虑到它帮助我更好地理解这个技巧的事实。我也在考虑极客头头的建议,重新发明越来越多的轮子(只要我有空闲时间这么做:D).嘿,太好了。我不知道那一行。不过我有一个问题。上面的代码是你用的吗?因为我认为你不能将using namespace
放在这样的类中。如果不是,我想知道你实际上在哪里使用这一行,因为我有点担心这会导致任何人包括我的头r或使用我的名称空间来强制使用它。
namespace scope {
class MyClass {
public:
bool operator== (const MyClass& that) {
return compare_for_equality_somehow(that);
}
bool operator< (const MyClass& that) {
return compare_for_lessality_somehow(that);
}
....
// using namespace std::rel_ops; // that one is incorrect
};
using std::rel_ops::operator=!; // similarly for >, >=, <=
} // end of namespace