Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/157.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 重载运算符++;前缀/后缀是否相互关联?_C++_Operator Overloading_Increment - Fatal编程技术网

C++ 重载运算符++;前缀/后缀是否相互关联?

C++ 重载运算符++;前缀/后缀是否相互关联?,c++,operator-overloading,increment,C++,Operator Overloading,Increment,我有一个问题以前可能已经被回答了9000多次,但我真的不知道该怎么说,这就是我要尝试的 我在一些C++书籍和教程中看到,当定义自己的类具有一个可迭代的值(可增量的)语义时,可以为它超载运算符++>代码>(我将这里所说的所有内容都适用于运算符-)。这样做的标准方式似乎是: class MyClass { public: MyClass& operator++ () { increment_somehow(); return *this;

我有一个问题以前可能已经被回答了9000多次,但我真的不知道该怎么说,这就是我要尝试的

我在一些C++书籍和教程中看到,当定义自己的类具有一个可迭代的值(可增量的)语义时,可以为它超载<代码>运算符++>代码>(我将这里所说的所有内容都适用于<代码>运算符-<代码>)。这样做的标准方式似乎是:

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。对于同一代码的多个类型,您所需要做的就是确保为每个使用新定义的操作符class
template
的类定义了所有方法


有关
模板的更多信息,请参阅文档。

如果您有时间,需要经验,请重新设计所有您喜欢的轮子。我自己做了几次,以提高对基本概念的了解。这会有很大帮助。

我是原始海报,只是回答说我终于注册到了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