我有一个班级cashier
,其中有3个属性: ID ,密码,尝试,标准GET& SET方法
//Header file
#ifndef CASHIER_H
#define CASHIER_H
#include <string>
using namespace std;
class cashier
{
public:
cashier();
cashier(const cashier& orig);
virtual ~cashier();
void setID(string);
string getID();
void setPassword(string);
string getPassword();
void settries(int);
int gettries();
private:
string ID;
string Password;
int tries;
};
#endif /* CASHIER_H */
cashier.cpp文件
#include "cashier.h"
cashier::cashier()
{
}
cashier::cashier(const cashier& orig)
{
}
cashier::~cashier()
{
}
void cashier::setID(string value)
{
this->ID = value;
}
void cashier::setPassword(string value)
{
this->Password = value;
}
string cashier::getID()
{
return this->ID;
}
string cashier::getPassword()
{
return this->Password;
}
void cashier::settries(int value)
{
this->tries=value;
}
int cashier::gettries()
{
return this->tries;
}
在我的主文件中,我试图从文本文件中读取并将值存储在收银员c中并将其推入我的矢量cashier_all
#include <iostream>
#include "cashier.h"
#include <fstream>
#include <vector>
int main()
{
fstream afile;
char rubbish[100];
afile.open("cashier.txt",ios::in);
afile.getline(rubbish,100); //read in first line
vector <cashier> cashier_all;
cashier c;
string temp_id;
string temp_password;
int temp_tries;
while(afile>>temp_id)
{
afile>>temp_password;
afile>>temp_tries;
c.setID(temp_id);
c.setPassword(temp_password);
c.settries(temp_tries);
cashier_all.push_back(c); //c is not being pushed into the vector
// for some unknown reason
}
vector<cashier>::iterator v1;
vector<cashier>::iterator v2;
v1 = cashier_all.begin();
v2 = cashier_all.end();
while (v1 != v2)
{
cout<<v1->getID()
<<endl
<<v1->getPassword()
<<endl
<<v1->gettries();
v1++;
}
system("PAUSE");
}
cashier.txt
CashierID password tries
001 def 0
002 ghi 0
003 jkl 0
检查我的调试器,错误发生在cashier_all.pushback,它没有将c推入vector cashier_all ,如果你不相信我,你可以自己尝试
编辑:删除所有构造函数后,它可以正常工作
我不明白为什么复制构造函数会影响收银员进入cashier_all,有人可以向我解释一下吗?
答案 0 :(得分:3)
摆脱生成方法的不必要实现,例如你的拷贝构造函数:你的拷贝构造函数与默认构造函数的作用相同。但是,它应该复制对象。删除它将导致复制构造函数执行此操作。作为额外的奖励,编译器还会为您生成移动构造函数。
将对象插入容器时,对象被复制(如果它是临时对象,则移动):C ++基于值,而不是基于引用!
答案 1 :(得分:3)
您当前的复制构造函数不是真正复制对象。一个体面的实施将是:
cashier::cashier(const cashier& orig)
: ID(origin.ID)
, Password(origin.Password)
, tries(origin.tries)
{}
但是C ++默认定义了这种构造函数,因此您不需要编写一个构造函数。您的默认构造函数和析构函数也是如此。
我也非常害怕:
你在那里提到过的短语。没有标准 GET和SET方法这样的东西。你的会员职能完全没有意义存在。标准GET&amp; SET方法
在这种情况下,您只需使用结构:
struct cashier {
std::string ID;
std::string Password;
int tries;
};
你能看到C ++的美丽吗?请记住,封装 不意味着:添加一堆getter和setter。