我想重载'>>'运算符,以便某人可以输入任意数量的值。
这是我正在进行的作业的要求verbatum:
操作员及GT;>应该期望看到以下形式的输入:d v1 v2 ... vd,其中d是向量的维数,每个vi是 与向量中的索引i对应的值。
我认为它的工作方式是第一个值是数组的大小(包含在对象Vex中),其余的是元素。所以,如果他们要输入
Vex vX;
4, 1, 2, 3, 4 >> vX;
vX将创建一个大小为4的动态数组,其中包含数字1-4。
我挂断的主要部分是如何编程>>重载因为会有可变数量的参数。
理想情况下,我会找到...的效果的解决方案(这只是一个例子):
std::istream& Vex::operator>>(istream& is, const Vex&){
/*
Assume int * data has been previously declared in constructor
data = new int[iterator[0]]
create iterator of input for istream
For n from 1 to iterator[0]...
data[n] = iterator[n]
*/
}
我只是不知道该怎么做。我一直在环顾四周,我找到了istream_iterator,但我找不到有人使用它的方式我需要使用它的任何好例子。
我希望我提供的信息足以回答这个问题。如果没有,请告诉我。
非常感谢你的时间。
答案 0 :(得分:8)
您的老师并没有要求您重载operator>>
来获取变量参数列表。他要求你以这样的方式重载operator>>
,它在运行时解析变量长度输入,由用户(或文件或任何istream
对象)给出。您需要的签名是:
std::istream& operator>>(istream& is, Vex& v)
它不应该是会员功能,但你可能需要它成为朋友。
我对这个Vex
类一无所知,所以我不能告诉你如何写这个函数,但它会是这样的:
read an integer N from the stream
set size of Vex object as N, however that's done
for i = 1 to N
read number X from the stream
store X in Vex object at position i
答案 1 :(得分:0)
您的参数列表需要以逗号分隔,然后您可以在一次operator<<
调用中传递其中的几个。
OpenCV就是这样做的。以下是它的使用方法(搜索逗号分隔): http://docs.opencv.org/modules/core/doc/basic_structures.html?highlight=comma-separated#mat
在这里查看一下cv::Mat_
的代码:
https://github.com/Itseez/opencv/blob/master/modules/core/include/opencv2/core/matx.hpp第840行
它使用辅助对象,你的任务是找出它是如何工作的。
答案 2 :(得分:0)
请记住,逗号是一个运算符。它计算每个表达式并返回右手操作数的值。此外,它从左到右关联。最后,>>
的优先级高于,
。这意味着
4, 1, 2, 3, 4 >> vX;
相当于
((((4, 1), 2), 3), (4 >> vX));
但4, 1
评估为1
,因此以上评估为
(((1, 2), 3), (4 >> vX));
评估为
((2, 3), (4 >> vX));
评估为
(3, (4 >> vX));
评估为
4 >> vX;
因此,要编译上述语句,必须重载
Vex& operator>>(int, Vex&);
从评论到原始问题,教授似乎希望您为operator>>
课程重载Vex
。这意味着签名应为:
istream& operator>>(istream&, Vex&);
答案 3 :(得分:0)
你在想它。仔细阅读规范。我认为以下内容非常接近所要求的内容。
GCC 4.7.3:g ++ -Wall -Wextra -std = c ++ 0x
#include <vector>
#include <iostream>
#include <string>
#include <sstream>
template <class T>
struct Vex {
std::vector<T> v;
};
template <class T>
std::istream& operator>>(std::istream& is, Vex<T>& vex) {
auto dim = 0;
is >> dim;
for (auto i = 0; i < dim; ++i) {
T t;
is >> t;
vex.v.push_back(t);
}
return is;
}
int main() {
std::stringstream is("4 1 2 3 4");
Vex<int> vex;
is >> vex;
for (auto i : vex.v) {
std::cout << i << " ";
}
return 0;
}