如何使用不同类的对象填充类中的向量

时间:2016-02-06 00:13:18

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

我正在开展一个项目,在这个项目中,我必须创建一类工人(带有一些基本信息)并将它们全部放在矢量中。

我找到了一个适合我的解决方案,但我很好奇有更好的方法吗?所以,我只是在寻找代码的不同实现。

这是我的代码:

#include<iostream>
#include<vector>
#include<string>
#include<iterator>

class worker
{
  private:
    std::string _name;
    int _age;
    double _pay;
  public:
    worker() : _age{0}, _pay{0.0} {}
    worker(std::istream& entry){ input(entry); }

    std::istream& input(std::istream& x){ return x >> _name >> _age >> _pay ; }

    const std::string& get_name() { return _name; }
    const int& get_age(){ return _age; }
    const double& get_pay(){ return _pay;}
};

class vecworkers
{
  private:
    std::vector<worker> vec_workers;
  public:
    void input(std::istream& x)
    {
      worker temp;
      while(temp.worker::input(x))
      vec_workers.push_back(temp);

    }

    void output(std::ostream& x)
    {
      worker temp;
      for( std::vector<worker>::const_iterator it = vec_workers.begin() ; it != vec_workers.end() ; ++it )
      {
        temp = *it ;
        std::cout << temp.get_name() << " "<< temp.get_age() << " " << temp.get_pay() << std::endl;
      }
    }

};

int main()
{
  vecworkers w1;
  w1.input(std::cin);
  w1.output(std::cout);
  return 0;
}

我非常感谢您提供的任何帮助。

4 个答案:

答案 0 :(得分:2)

编辑1:您的问题标题有点误导

<强>解答:

好吧,既然你标记了C ++ 11,我假设我可以在这里使用C ++ 11功能......所以:

关于您的代码的一些建议:

  • worker班级中的getter返回const reference,应标记为const个函数,因此您拥有:

    const std::string& get_name() const { return _name; }
    const int& get_age() const { return _age; }
    const double& get_pay() const { return _pay;}
    
  • 同样,没有必要返回const int&const double&,(尽管我相信优化工具会解决这个问题。)

    const std::string& get_name() const { return _name; }
    int get_age() const { return _age; }
    double get_pay() const { return _pay;}
    
  • 您可能需要考虑为<<重载插入和提取操作符>>worker。它传达了信息。

  • 除了结束输入循环外,如何根据错误的格式处理istream失败?你可能想要考虑一下。即使没有失败,一个错误的格式搞砸整个vecwkers的输入

  • 第一种选择(没有设计更改,只是清理...... 但请记住,您必须对此进行上述const更正):
class vecworkers
{
  private:
    std::vector<worker> vec_workers;
  public:
    void input(std::istream& x)
    {
        for(worker w; w.input(x); vec_workers.push_back(w));
    }

    void output(std::ostream& x)
    {
        for(const auto& w : vec_workers)
            std::cout << w.get_name() << " " << w.get_age() << " " << w.get_pay() << std::endl;
    }

};
  • 第二种选择(移动印刷责任......或者你可能想要一个负责印刷的课程,如果你有不同的风格)
class worker
{
  private:
    std::string _name;
    int _age;
    double _pay;
  public:
    worker() : _age{0}, _pay{0.0} {}
    worker(std::istream& entry){ input(entry); }

    std::istream& input(std::istream& x){ return x >> _name >> _age >> _pay ; }
    std::ostream& output(std::ostream& x) const { return x << _name << _age << _pay; }

    const std::string& get_name() const { return _name; }
    int get_age() const { return _age; }
    double get_pay() const { return _pay;}
};

class vecworkers
{
  private:
    std::vector<worker> vec_workers;
  public:
    void input(std::istream& x)
    {
        for(worker w; w.input(x); vec_workers.push_back(w));
    }

    void output(std::ostream& x)
    {
        for(const auto& w : vec_workers)
            w.output(std::cout);    //since you didn't overload insertion operator <<
    }

};
  • 第三种替代方案?......这对于复合来说是非常微不足道的......所以,通过一些清理你的解决方案就可以了。

答案 1 :(得分:1)

我更喜欢使用超出问题范围的个人原因使用指针。

简单地添加另一个类的对象(有点误导)决定你是否希望你的向量拥有这些对象,持有一个引用或指向它们的指针。

在您的实现中,您创建一个对象,然后将其复制到向量中。

worker temp;
while(temp.worker::input(x))
vec_workers.push_back(temp);

握住指针是一种不同的方法:

auto tmp = std::unique_ptr<worker>(new worker(x));
vec_workers.push_back(std::move(tmp));

这里你在堆上分配一次,并保持一个指针(向量拥有它)。与共享/智能指针相同或多或少的方法。

引用有点棘手,需要使用std::reference_wrapper

您也可以直接复制矢量中的对象。

workers.push_back(std::move(worker(x));

或使用原始指针std::vector<worker*> workers;

答案 2 :(得分:0)

正如我在这里看到的那样,对象不属于不同类别,或者我是错误的。

他们可能有不同的构造函数,但仍然没有不同的类。

对一个类型使用特定的向量类是没用的,但我认为更具可读性。

您无法生成多个类的向量,因为这是由于向量语法而无法实现的。

如您所见,您使用

声明了一个向量
    vector <type>

,而不是

    vector <type,...>

所以你只能拥有单一类型的向量。

另外,如果你可以制作一个多个类的向量,那么会增加大小,因为它会增加不同的数量,具体取决于你放入它的对象类。

答案 3 :(得分:0)

您需要使用多态和继承来实现此功能。从技术上讲,不同类型的对象不能添加到向量中,但继承和多态可以使它看起来像它。

所以你可以有一个这样的矢量

vector<BaseClass*> vec;

将派生类的对象推送到它。许多现代编程语言都具有从一个共同的&#34;对象&#34;使这个和其他事情成为可能的课程