【问题标题】:Stuck in pointers, printing the vector of class objects with vector of pointers to the output console卡在指针中,使用指向输出控制台的指针向量打印类对象的向量
【发布时间】:2021-04-10 19:49:08
【问题描述】:

我是编程新手并坚持使用示例。

  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;

【问题讨论】:

  • 我看过很多关于打印类对象的帖子,但在这里仍然无法解决问题。为回答基本问题而道歉,但我想在这里了解这些概念的见解。谢谢!
  • 感谢保罗的评论。我已经尝试过这个并添加了ostream&amp; operator&lt;&lt;(ostream&amp; os, const ptr_generator&amp; ptr_obj) { os &lt;&lt; ptr_obj.ptr_arr[0] &lt;&lt; " " &lt;&lt; ptr_obj.ptr_arr[1] &lt;&lt; " " &lt;&lt; ptr_obj.ptr_arr[2]; return os; },它正在向我返回地址。你能告诉我如何使用这个在输出控制台中打印我的原始向量 vec1 和 vec2?

标签: c++ class c++11 pointers vector


【解决方案1】:

这里有很多事情是行不通的。

首先,myvec,因此MyVectorstd::vector&lt;ptr_generator&gt;,我们可以达成一致,是吗?

因此,当您编写 std::cout &lt;&lt; MyVector[0]; 时,您真正要做的是在 ptr_generator 上调用 cout。但是ptr_generator 没有operator&lt;&lt; 可以对其进行操作。你将不得不写一个。

当你这样做时,你会发现你的ptr_generator 类需要做很多工作。首先,您需要一个成员变量来存储您传入的数据。但是,您不能获取并存储函数参数的地址,就像在{{&amp;v1, &amp;v2}}。如果要存储它们,则需要对其进行复制。

【讨论】:

  • 感谢@Tumbleweed53,这对我很有帮助,会让我学到很多东西
【解决方案2】:

您需要为ptr_generator 重载operator&lt;&lt; 函数。

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 以通过引用获取向量。实际上,它们是按价值计算的,因此在函数之间被复制。然后在构造函数中,当您获取向量的地址时,您获取的是复制向量的地址,而不是原始地址。这是未定义的行为,因为这些向量将超出范围。

【讨论】:

  • 感谢@Paul Ronney 的详细描述和更改代码。非常感激!您能否向我建议任何特定的链接来更详细地研究这些概念?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-08-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-20
相关资源
最近更新 更多