如何将 vector 传递给将自定义对象作为参数的重载输出流

How to pass vector to a overloaded output stream that takes a custom object as an argument?

本文关键字:参数 重载 输出流 对象 自定义 vector      更新时间:2023-10-16
 class example{
 int n;
 vector <double> vec;
 example(const vector <double> &vec) : vec(vec){}
 void set_data(const vector<double> &v){vec = v;}
 const vector<double> &get_data() const {return vec;}
 };
ostream &operator<< (ostream &output, const sample &s){
  return output << "< " << s.get_data().size()  << " : " << //element1 << element2 << //elementN;
}

我正在尝试为创建矢量对象的类创建自定义输出流。这输出应返回大小(即向量中的元素数)和向量中的元素。

现在的问题是,当我创建一个新的示例类对象时,它只创建一个带有一个元素的向量。

例如,当我创建一个像'sample s(vector vec)这样的对象时;它可以理解地创建一个带有一个项目的对象。我尝试向构造函数添加更多参数,例如"const vector &vec(n), int n): vec(vec), n(n){}",但它仍然不起作用。编译器返回一个错误,指出:"预期","或"..."在"("标记之前。

为了使答案具体化,您需要构造函数

 class example{
 // ...
 example(const vector<double> &vec_, int n_)
   : vec(vec_), n(n_)
 { }
 // ... 
};

这会将vec初始化为参数的副本,应通过引用传递该参数以避免多余的副本。

这一行:

vector<double> vec(n);

不能作为变量声明显示在类体内。它应该像这样初始化:

vector<double> vec = vector<double>(n); // copy-initialization

或使用成员初始值设定项列表:

example(vector<double> vec const&) : vec(vec) { }

这将从另一个实例复制构造它。

您的错误与vector、流或访问控制完全无关。您只是使用无效的语法来声明 vec 成员和构造函数参数。

编辑以回答更新的问题:

现在的问题是,当我创建一个新的示例类对象时,它只创建一个带有一个元素的向量。

这是一个与你原来的问题不同的问题。您应该打开一个新问题。

例如,当我创建一个像'sample s(vector vec)这样的对象时;它可以理解地创建一个带有一个项目的对象。

不,这声明了一个名为 s 的函数,该函数接受名为 vecvector参数并返回一个sample。你真的需要把语言的基本语法写下来。