卡在指针中,将带有指针向量的类对象向量打印到输出控制台



我是编程新手,一直使用一个示例。

  1. 我创建了一个类ptr_generator,它通过构造函数创建指针数组。这里,这些指针指向一个二重向量
  2. 然后创建类ptr_generator类型的向量myvec

我在打印指针指向的双打的初始矢量时遇到问题。

有人能帮我弄清楚吗?

/******************************************************************************
Online C++ Compiler.
Code, Compile, Run and Debug C++ program online.
Write your code in this editor and press "Run" button to compile and execute it.
*******************************************************************************/
#include <iostream>
#include <vector>
#include <typeinfo>
#include <array>
using namespace std;
struct ptr_generator 
{
ptr_generator ( std::vector<double> v1 , std::vector<double> v2)
{
std::array<std::vector<double>* , 2> ptr_arr {{&v1, &v2}};
}
};
//Myarr is a vector of ptr_generator class objects
using myvec = std::vector< ptr_generator> ;
myvec myfunction (std::vector<double> v1, std::vector<double> v2 )
{
myvec MyVector;

MyVector.push_back(ptr_generator(v1, v2));

std::cout << MyVector[0]<< std::endl;

return MyVector;
}

int main()
{

std::vector<double> vec1 { 1.0, 2.0, 2.1, 3.1};
std::vector<double> vec2 { 1.0, 4.0, 6.1, 2.1};

myfunction (vec1, vec2);




return 0;
}

错误:

main.cpp: In function ‘myvec myfunction(std::vector<double>, std::vector<double>)’:
main.cpp:33:15: error: no match for ‘operator<<’ (operand types are ‘std::ostream {aka std::basic_ostream}’ and ‘__gnu_cxx::__alloc_traits >::value_type {aka ptr_generator}’)
std::cout << MyVector[0]<< std::endl;

这里发生了很多不起作用的事情。

首先,myvec,因此MyVectorstd::vector<ptr_generator>,我们可以同意这一点,是吗?

因此,当您编写std::cout << MyVector[0];时,您真正要做的是在ptr_generator上调用cout。但是ptr_generator没有operator<<可以操作它。你必须写一个。

当你这样做的时候,你会发现你的ptr_generator类需要做很多工作。首先,您需要一个成员变量来存储您传入的数据。但是,您不能像在{{&v1, &v2}}中那样获取和存储函数参数的地址。如果你想保存它们,你需要复制它们。

您需要为ptr_generator重载operator<<函数。

std::array没有存储在构造函数之外,因此我们将其添加为ptr_generator类的成员。然后我们将做两个循环;一个在数组上循环,一个在向量上循环。由于数组包含向量指针,我们需要在迭代它们之前取消对它们的引用。

#include <iostream>
#include <vector>
#include <array>
using namespace std;
struct ptr_generator
{
using vec_dbl = vector<double>;
ptr_generator(vec_dbl& v1, vec_dbl& v2)
: storage_({ &v1, &v2 })
{}
friend ostream& operator<<(ostream& os, const ptr_generator& pg)
{
for (auto v : pg.storage_)
{
for (auto d : *v)
{
os << d << ' ';
}
os << 'n';
}
return os;
}
private:
array<vec_dbl*, 2> storage_;
};
using myvec = vector<ptr_generator>;
myvec myfunction(ptr_generator::vec_dbl & v1, ptr_generator::vec_dbl & v2)
{
myvec myvec;
myvec.push_back(ptr_generator(v1, v2));
cout << myvec[0] << endl;
return myvec;
}
int main()
{
vector<double> vec1{ 1.0, 2.0, 2.1, 3.1 };
vector<double> vec2{ 1.0, 4.0, 6.1, 2.1 };
myfunction(vec1, vec2);
}

需要注意的另一件事是,我更改了构造函数和myfunction,以通过引用获取向量。事实上,它们是按值获取的,因此在函数之间被复制。然后在构造函数中,当你获取向量的地址时,你获取的是复制向量的地址,而不是原始向量的地址。这是未定义的行为,因为这些向量将超出范围。

最新更新