运算符重载,所有运算符 definition/header
Operator overloading, definition/header for all operators
如何最好地将以下迭代器代码拆分为 header 和定义。
// std::iterator example
#include <iostream> // std::cout
#include <iterator> // std::iterator, std::input_iterator_tag
class MyIterator : public std::iterator<std::input_iterator_tag, int>
{
int* p;
public:
MyIterator(int* x) :p(x) {}
MyIterator(const MyIterator& mit) : p(mit.p) {}
MyIterator& operator++() {++p;return *this;}
MyIterator operator++(int) {MyIterator tmp(*this); operator++(); return tmp;}
bool operator==(const MyIterator& rhs) const {return p==rhs.p;}
bool operator!=(const MyIterator& rhs) const {return p!=rhs.p;}
int& operator*() {return *p;}
};
int main () {
int numbers[]={10,20,30,40,50};
MyIterator from(numbers);
MyIterator until(numbers+5);
for (MyIterator it=from; it!=until; it++)
std::cout << *it << ' ';
std::cout << '\n';
return 0;
}
来自:http://www.cplusplus.com/reference/iterator/iterator/
在这种情况下,您将如何实施其他运算符?
此示例还显示您将一个数组传递给迭代器,但如果您希望能够遍历某些 属性(s) 或您的 class实例有?
你会创建一个单独的迭代器来与你的 class 一起工作,还是在 class 本身内部实现运算符方法?
关于拆分成实现和定义我会这样做
MyIterator.h 文件:
#IFNDEF MYITERATOR_H
#DEFINE MYITERATOR_H
#include <iterator>
class MyIterator : public std::iterator<std::input_iterator_tag, int>
{
private:
int* p;
public:
MyIterator(int *);
MyIterator(const MyIterator&);
MyIterator& operator++();
MyIterator operator++(int);
bool operator==(const MyIterator&);
bool operator!=(const MyIterator&);
int& operator*();
};
#ENDIF
MyIterator.cpp 文件:
#include "MyIterator.h"
MyIterator::MyIterator(int * x){
p = x;
}
MyIterator::MyIterator(const MyIterator& mit){
p = mit.p;
}
MyIterator& MyIterator::operator++(){
++p;
return *this;
}
MyIterator MyIterator::operator++(int x){
MyIterator temp(*this);
++p;
return temp;
}
bool MyIterator::operator==(const MyIterator& rhs){
return p == rhs.p;
}
bool MyIterator::operator!=(const MyIterator& rhs){
return p != rhs.p;
}
int& operator*(){
return *p;
}
你只需要将#include "MyIterator.h"
添加到你的主程序中就可以使用它
如何最好地将以下迭代器代码拆分为 header 和定义。
// std::iterator example
#include <iostream> // std::cout
#include <iterator> // std::iterator, std::input_iterator_tag
class MyIterator : public std::iterator<std::input_iterator_tag, int>
{
int* p;
public:
MyIterator(int* x) :p(x) {}
MyIterator(const MyIterator& mit) : p(mit.p) {}
MyIterator& operator++() {++p;return *this;}
MyIterator operator++(int) {MyIterator tmp(*this); operator++(); return tmp;}
bool operator==(const MyIterator& rhs) const {return p==rhs.p;}
bool operator!=(const MyIterator& rhs) const {return p!=rhs.p;}
int& operator*() {return *p;}
};
int main () {
int numbers[]={10,20,30,40,50};
MyIterator from(numbers);
MyIterator until(numbers+5);
for (MyIterator it=from; it!=until; it++)
std::cout << *it << ' ';
std::cout << '\n';
return 0;
}
来自:http://www.cplusplus.com/reference/iterator/iterator/
在这种情况下,您将如何实施其他运算符?
此示例还显示您将一个数组传递给迭代器,但如果您希望能够遍历某些 属性(s) 或您的 class实例有?
你会创建一个单独的迭代器来与你的 class 一起工作,还是在 class 本身内部实现运算符方法?
关于拆分成实现和定义我会这样做
MyIterator.h 文件:
#IFNDEF MYITERATOR_H
#DEFINE MYITERATOR_H
#include <iterator>
class MyIterator : public std::iterator<std::input_iterator_tag, int>
{
private:
int* p;
public:
MyIterator(int *);
MyIterator(const MyIterator&);
MyIterator& operator++();
MyIterator operator++(int);
bool operator==(const MyIterator&);
bool operator!=(const MyIterator&);
int& operator*();
};
#ENDIF
MyIterator.cpp 文件:
#include "MyIterator.h"
MyIterator::MyIterator(int * x){
p = x;
}
MyIterator::MyIterator(const MyIterator& mit){
p = mit.p;
}
MyIterator& MyIterator::operator++(){
++p;
return *this;
}
MyIterator MyIterator::operator++(int x){
MyIterator temp(*this);
++p;
return temp;
}
bool MyIterator::operator==(const MyIterator& rhs){
return p == rhs.p;
}
bool MyIterator::operator!=(const MyIterator& rhs){
return p != rhs.p;
}
int& operator*(){
return *p;
}
你只需要将#include "MyIterator.h"
添加到你的主程序中就可以使用它