C++ 如何超载>&燃气轮机;运算符获取变量参数列表
我想重载一个'>>'操作符,这样某人就可以输入任意数量的值 这是我正在处理的任务的详细要求: 操作员>>应期望看到以下形式的输入:d v1 v2… vd,其中d是向量的维数,每个vi是 与向量中的索引i相对应的值 我假设它的工作方式是,第一个值是数组的大小(包含在object Vex中),其余的值是元素。所以如果他们输入C++ 如何超载>&燃气轮机;运算符获取变量参数列表,c++,operator-overloading,C++,Operator Overloading,我想重载一个'>>'操作符,这样某人就可以输入任意数量的值 这是我正在处理的任务的详细要求: 操作员>>应期望看到以下形式的输入:d v1 v2… vd,其中d是向量的维数,每个vi是 与向量中的索引i相对应的值 我假设它的工作方式是,第一个值是数组的大小(包含在object Vex中),其余的值是元素。所以如果他们输入 Vex vX; 4, 1, 2, 3, 4 >> vX; vX将创建一个大小为4的动态数组,其中包含数字1-4 我挂断电话的主要部分是如何编程>>重载,因为参数
Vex vX;
4, 1, 2, 3, 4 >> vX;
vX将创建一个大小为4的动态数组,其中包含数字1-4
我挂断电话的主要部分是如何编程>>重载,因为参数的数量是可变的
理想情况下,我会有一个解决方案的影响。。。(这只是一个例子):
我只是不知道该怎么做。我一直在四处寻找,发现了istream_迭代器,但我找不到任何好的例子,说明有人以我需要的方式使用它
我希望我提供的信息足以回答这个问题。如果没有,请告诉我
非常感谢您抽出时间 您的参数列表需要用逗号分隔,然后您可以在一个
运算符中传递多个参数记住逗号是一个运算符。它计算每个表达式并返回右操作数的值。而且,它从左到右关联。最后,>
的优先级高于,
。这意味着
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;
评估结果是
(((1, 2), 3), (4 >> vX));
((2, 3), (4 >> vX));
(3, (4 >> vX));
4 >> vX;
评估结果是
(((1, 2), 3), (4 >> vX));
((2, 3), (4 >> vX));
(3, (4 >> vX));
4 >> vX;
评估结果是
(((1, 2), 3), (4 >> vX));
((2, 3), (4 >> vX));
(3, (4 >> vX));
4 >> vX;
因此,要编译上述语句,必须重载
Vex& operator>>(int, Vex&);
从对您原始问题的评论来看,教授似乎希望您为您的Vex
课程超载operator>
。这意味着签名应为:
istream& operator>>(istream&, Vex&);
您的老师没有要求您重载运算符>>
以获取变量参数列表。他要求您重载操作符>>
,以便它在运行时解析用户(或文件,或任何istream
对象)给定的可变长度输入。您需要的签名是:
std::istream& operator>>(istream& is, Vex& v)
它不应该是成员函数,但您可能需要它作为朋友
我对这个Vex
类一无所知,因此我无法告诉您如何编写函数,但它会是这样的:
从流中读取整数N
将Vex对象的大小设置为N,但已完成
对于i=1到N
从流中读取数字X
将X存储在位置i的Vex对象中
你想得太多了。更仔细地阅读规范。我认为以下内容与所问的内容非常接近
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;
}
#包括
#包括
#包括
#包括
模板
结构凸{
std::向量v;
};
模板
std::istream&operator>>(std::istream&is,Vex&Vex){
自动调光=0;
是>>暗淡;
用于(自动i=0;i>t;
vex.v.向后推(t);
}
回报是;
}
int main(){
std::stringstream是(“41234”);
烦恼;
是>>烦恼;
用于(自动i:vex.v){
std::难道你不能这样做吗。还有其他同样方便的方法,比如vX={1,2,3,4};
,但是如果你必须坚持这种特殊的语法,你就不走运了。为了确保我说得清楚,我将逐字复制我的编程作业中的要求:“运算符>>应期望看到以下形式的输入:d v1 v2…vd,其中d是向量的维数,每个vi是对应于向量中索引i的值。"你真的应该从你的老师那里得到澄清,但我很肯定,d v1 v2…vd
指的是运行时的用户输入。不是源代码。这不是惯用的。>>是提取运算符,但你像插入运算符一样使用它。不,
绑定得比,
更紧密,无论它是否重载r不是,因此4,1,2,3,4>>vX
相当于4,1,2,3,(4>>vX)
(这反过来相当于(4>>vX)
,因为文字没有副作用,它们的值被丢弃)。您的意思是“将X存储在Vex对象中的位置i”?