如何解决卡在指针中,使用指向输出控制台的指针向量打印类对象的向量
我是编程新手,并坚持使用示例。
我在打印出指针指向的双精度的初始向量时遇到问题。
有人可以帮我解决这个问题吗?
/******************************************************************************
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
,因此 MyVector
是 std::vector<ptr_generator>
,我们同意这一点,是吗?
因此,当您编写 std::cout << MyVector[0];
时,您真正在做的是在 cout
上调用 ptr_generator
。但是 ptr_generator
没有可以对其进行操作的 operator<<
。你将不得不写一个。
当您这样做时,您会发现您的 ptr_generator
类需要大量工作。首先,您需要一个成员变量来存储您传入的数据。但此外,您不能获取和存储函数参数的地址,就像您在{{&v1,&v2}}
。如果您想存储它们,则需要制作它们的副本。
您需要为 operator<<
重载 ptr_generator
函数。
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
以通过引用获取向量。就像它们一样,它们是按值获取的,因此在函数之间被复制。然后在构造函数中,当您获取向量的地址时,您获取的是复制向量的地址,而不是原始向量的地址。这是未定义的行为,因为这些向量将超出范围。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。