如何将双精度向量传递给构造函数,然后在子类中访问其数据(在 C++ 中)?

Posted

技术标签:

【中文标题】如何将双精度向量传递给构造函数,然后在子类中访问其数据(在 C++ 中)?【英文标题】:How do I pass in a vector of doubles to a constructor and then access its data in child classes (in C++)? 【发布时间】:2014-07-17 06:30:54 【问题描述】:

我希望不仅能够创建图表,还希望能够创建条形图,并传入一个双精度向量并将该数据放入私有成员数据中。我将如何在图表的条形图(子)类中执行此操作?此外,我仍然对通过指针、引用或值传递感到困惑,所以我不确定我是否在此处正确传递它。请让我知道如何解决这个烂摊子。感谢您的帮助!

#include <vector>
using namespace std;
class Chart

  public:
    Chart(vector<double> &d) : data(d) 
    virtual void draw() const;
  protected:
    double value_at(int index) const; // ... only allows access, not modification
    int get_size() const
    
      return data.size();
    
  private:
    vector<double> &data; // Now data is safely private
;

class BarChart : public Chart

  public:
    virtual void draw() const
    
      for (int x = 0; x < get_size() - 1; x++)
      
        cout << value_at(x) << " ";
        for (int y = 0; y < value_at(x); y++)
        
          cout << "*";
        
        cout << endl;
      
    
;

#include <iostream>
#include "chart.h"
#include <vector>    
int main(int argc, char** argv)

  vector<double> doubles;
  doubles.resize(4);
  for (int x = 0; x < 4; x++)
  
    doubles[x] = x + 1.7;
  
  BarChart c(doubles);
    return 0;

【问题讨论】:

你的数据成员是一个引用,所以你需要传递一个引用。 data 设为参考可能是个非常糟糕的主意。 如果您不打算更改数据,请将其设为 const 引用。但请记住,您有责任确保在Chart 对象之前不会破坏引用的数据。让 Chart 对象拥有自己的数据会更加健壮:要么按值保存,要么通过 shared_ptr 保存。 【参考方案1】:

我想这就是你现在想要的。顺便说一句,你必须为你的未来阅读这些东西:)

    访问修饰符在继承中的工作原理 构造函数如何在继承中初始化 引用传递和值传递有什么区别。

这些都是你可以在互联网上阅读的。只是需要花一些时间来查找和阅读。

#include <vector>
#include <iostream>

class Chart

public:
    Chart(std::vector<double> &d) : data(d) 
    virtual void draw()
    double value_at(int index) const return data[index]; 
    int get_size() constreturn data.size(); 
private:
    std::vector<double> &data;
;

class BarChart : public Chart

public:
    BarChart(std::vector<double> &d):Chart(d)
    
    
    virtual void draw()
    
        for (int x = 0; x < get_size() - 1; x++)
        
            std::cout << value_at(x) << " ";
            for (int y = 0; y < value_at(x); y++)
            
                std::cout << "*";
            
            std::cout << std::endl;
        
    
;

int main()

    std::vector<double> barchartData;
    barchartData.push_back(10);
    barchartData.push_back(20);
    BarChart barchart(barchartData);
    std::cout << "Barchart size :" << barchart.get_size() << std::endl;

    std::vector<double> chartData;
    chartData.push_back(500);
    chartData.push_back(600);
    Chart chart(chartData);
    std::cout << "Chart size :" << chart.get_size() << std::endl;
    return 0;

【讨论】:

谢谢你。一开始没有编译,不知道是什么问题。但我得到了它的工作。这很好用。有一个小的逻辑问题 - 在 BarChart 类的虚拟 void 绘制方法中,它应该是 x

以上是关于如何将双精度向量传递给构造函数,然后在子类中访问其数据(在 C++ 中)?的主要内容,如果未能解决你的问题,请参考以下文章

我将向量作为双精度传递给函数,但视觉工作室将其称为无符号整数

如何将向量传递给基于推力的 odeint 观察者的构造函数,以便可以在函子中读取它

如何将子类作为期望基类的函数的参数传递,然后将该对象传递给指向这些抽象类对象的指针向量?

无法从构造函数中将数组值传递给向量

如何从 C# 将双指针传递给 COM 并在 COM 中初始化它

如何在不使用向量的情况下将数组传递给函数?