我正在开展一个项目,在这个项目中,我必须创建一类工人(带有一些基本信息)并将它们全部放在矢量中。
我找到了一个适合我的解决方案,但我很好奇有更好的方法吗?所以,我只是在寻找代码的不同实现。
这是我的代码:
#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;
}
我非常感谢您提供的任何帮助。
答案 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;使这个和其他事情成为可能的课程