簡體   English   中英

卡在指針中,打印 class 對象的向量以及指向 output 控制台的指針向量

[英]Stuck in pointers, printing the vector of class objects with vector of pointers to the output console

我是編程新手,並堅持一個例子。

  1. 我創建了一個 class ptr_generator,它通過其構造函數創建一個指針數組。 這里這些指針指向一個雙精度向量。
  2. 然后創建一個 class 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 ,因此MyVector是一個std::vector<ptr_generator> ,我們可以同意,是嗎?

所以當你寫std::cout << MyVector[0]; 那么你真正要做的是在ptr_generator上調用cout 但是ptr_generator沒有operator<<可以對其進行操作。 你將不得不寫一個。

當你這樣做時,你會發現你的ptr_generator class 需要做很多工作。 首先,您需要一個成員變量來存儲您傳入的數據。但是,您不能像在{{&v1, &v2}}中那樣獲取和存儲 function arguments 的地址。 如果要存儲它們,則需要制作它們的副本。

您需要為 ptr_generator 重載operator<< ptr_generator

std::array不存儲在構造函數之外,因此我們將其添加為ptr_generator class 的成員。 然后我們會做兩個循環; 一個循環遍歷數組,一個循環遍歷向量。 由於數組包含向量指針,我們需要在迭代它們之前取消引用它們。

#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以通過引用獲取向量。 實際上,它們是按價值計算的,因此在函數之間被復制。 然后在構造函數中,當您獲取向量的地址時,您獲取的是復制向量的地址而不是原始向量的地址。 這是未定義的行為,因為這些向量將從 scope 中取出 go。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM