Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/14.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 - Fatal编程技术网

C++ 如何超载>&燃气轮机;运算符获取变量参数列表

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 我挂断电话的主要部分是如何编程>>重载,因为参数

我想重载一个'>>'操作符,这样某人就可以输入任意数量的值

这是我正在处理的任务的详细要求:

操作员>>应期望看到以下形式的输入:d v1 v2… vd,其中d是向量的维数,每个vi是 与向量中的索引i相对应的值

我假设它的工作方式是,第一个值是数组的大小(包含在object Vex中),其余的值是元素。所以如果他们输入

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”?